美文网首页
写了一个Gank客户端

写了一个Gank客户端

作者: rabbitknight | 来源:发表于2018-01-25 13:14 被阅读79次

    银子

    摸鱼用gank.io公开API写了个练手项目。主要是在实际的项目中使用一些主流的技术,诸如MVP,RxJava,Dagger等。
    项目地址:GankU:https://github.com/rabbitknight/GankU

    TL;DR

    技术 概要
    RxJava2+Retrofit RxJava仅配合Retrofit,作为网络请求资源的处理使用。
    MVP 使用mvp架构思想,M层未做较优处理。V、P层隔离、仅接口访问。Activity与Fragment既是V层,又是P与V结合的地方。
    Dagger2 强化Dagger的使用,P层、控件、网络请求均使用Dagger注入到Act\Frag。
    M D 使用ToolBar、NavView、SRL、CoordinatorLayout等。
    Animator 部分使用了属性动画、包含animated-vector向量动画的使用。
    Custom View 为ImageView添加包装类实现手势操作,一个使用了贝塞尔曲线的indicator,自定义的ItemDecoration等。
    Web 使用腾讯X5内核作为WebView,待添加CustomTabs获取更优秀的效果。
    ... ...
    --- ---

    项目结构

    └─ganku
        ├─common            + common包,静态变量等
        ├─di                + dagger依赖注入包
        │  ├─component      - 注射器 
        │  ├─module         - 模块
        │  └─scope              - 作用域
        ├─mvp               + mvp包,项目为mvp架构
        │  ├─model          + 数据层,有缺陷
        │  │  └─remote          - bean类等
        │  ├─presenter      + 表现层,专注业务逻辑处理
        │  │  ├─base            - 最基本接口
        │  │  ├─impl            - 接口实现
        │  │  └─interfaces      - 集成接口
        │  └─view           + 显示层,专注View的显示
        │      ├─base           - 最基本的接口
        │      ├─interfaces     - 集成接口
        │      └─ui             + ui显示包,接口实现
        │          ├─activity       - Activity
        │          ├─adapter        - 适配器
        │          ├─fragment       - 碎片,用于显示
        │          ├─listener       - 监听器
        │          └─widget         - 自定义组件
        ├─net               + 网络访问包,注:已被废弃
        │  └─api                - Retorfit的接口
        └─utils             + utils辅助类,String处理等
    

    运行Demo

    desc img
    desc img
    --- ---
    launcher launcher
    main main1
    main2 main2
    Web web
    --- ---

    使用技术:

    参考build.gradle

        compile 'com.android.support:appcompat-v7:26.1.0'
        compile 'com.android.support:support-v4:26.1.0'
        compile 'com.android.support:design:26.1.0'
        compile 'com.android.support:recyclerview-v7:26.1.0'
        compile 'com.android.support:cardview-v7:26.1.0'
        compile 'com.android.support:customtabs:26.1.0'
        testCompile 'junit:junit:4.12'
        compile 'com.google.dagger:dagger:2.13'
        annotationProcessor 'com.google.dagger:dagger-compiler:2.13'
        compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
        compile 'io.reactivex.rxjava2:rxjava:2.1.6'
        compile 'com.github.bumptech.glide:glide:4.3.1'
        annotationProcessor 'com.github.bumptech.glide:compiler:4.3.1'
        compile 'com.squareup.retrofit2:retrofit:2.3.0'
        compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
        compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
        compile 'com.squareup.retrofit2:converter-gson:2.3.0'
        compile 'com.squareup.okhttp3:okhttp:3.9.0'
        compile 'com.jakewharton:butterknife:8.4.0'
        annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
    

    一点点总结

    1. 关于Dagger2的依赖注入,看到一些github上的同级别项目,并没有将Dagger这一流痞的库很好的使用他们在Activity中仍然很多new Clazz();。为此,我强化了Dagger的使用,致使项目中MVP中的P层使用依赖注入到Activity\Fragment,同时很多的View要么使用ButterKnife,要么使用Dagger注入到相应位置,使得在项目中基本看不到new Clazz(); 这种方法。
    2. 关于MVP项目,借助于Dagger2的使用,使得MVP三层分离的比较彻底。三层各司其职,仅通过接口访问,OOP。
      • View层专注于界面的显示,其向外暴露的接口仅用于控制界面的显示效果。
      • Presenter层专注于事务,它通过View层接口传递的信息,进行逻辑处理,并调用V层暴露的接口控制View层界面做出改变。
      • Model层专注于数据,道理上说,V层的事件交于P层处理,P层可能会调用M层的接口获取一些数据。然而因为强化Dagger的使用,我将RRO的网络访问框架直接注入到了P层--,那么M层就一下子消失了--,所以实际上框架可能实际只是MV<strike>p</strike>,还不是MVP。但是使用思想并不意味着要完全实现。
      • Activity\Fragment既是View又是P层与V层结合的地方。Act与Frag对于Android来说既是一个View显示的地方又是一个做逻辑处理。
      • 在MVC思想中,V实际代表的是XML布局,那么C在Android中就是Activity等,对应的很好。但是对于MVP,我们将P层抽离,但是P层又仅能在Activity中被调用,依赖Act存在。而Act又是某种意义上的View,这时的Activity的地位就稍微有点尴尬了。因此实际上,私以为Android中的MVP思想实际是一种代理模式这种说法对于大部分和用户交互的App应该是没问题的。
    3. Rx系函数式编程。函数式编程、响应式编程我了解比较浅,对于这种编程思想来说,一个函数的输出作为另一种函数的输入。函数相互调用形成一种链状的“流”。这与观察者模式不谋而合,通过对这种思想的使用,使得整个工程结构更加清晰,我们只需关注每个函数流的流向即每个函数的功能,将每个逻辑单独抽离,而不关注具体的实现,这使得项目更加清晰,也符合OOP的原则、高内聚低耦合。
    4. 关于自定义View,至今,据我了解,Android从业者呈现一种金字塔形势分布,较为低级的人员充斥在这个市场当中,但越往上的能力者越少。我也在想从13年移动行业的井喷式增长开始,到18年我该毕业的今天,拥有5年左右的开发者,他们在整个行业中处于什么样的地位,他们拥有怎样的技能树。我遇到的人,还是较少,暂不能得到答案。但以不变应万变,基础的东西的变化仍然是较低的,对于自定义View的掌握肯定是必要的。如今开发,想要获得一个效果,搜一下第三方库就很多。虽不要重复早轮子,但是前提是会造轮子。不需要知道细枝末节,但是对于脉络原理还是要知道的。为此学习一些自定义View是很必要的。我在这个项目中实现了一个贝塞尔拟合圆的ViewPager指示器,实际挺简单,300行左右的代码但是对于自定义View的收获还是挺多的。
    5. MD,Material Design是一种设计风格,与IOS的扁平化相对应。目前大部分的App,还是喜欢和IOS对齐,这也没错。我所了解的App中Android端的BiliBili、网易云等对于MD的应用最为出色。可能我们不是写UI的不需要设计的很好看,但是去发现美(无论是何种美)确实应该去做的。
    6. 。。。

    TODO

    • IMG
      • ImageViewWrap,手势包装类的优化
      • 妹子图的下载收藏等
    • Web
      • CustomTab的集成,获取更好体验
      • 右上角分享、复制URL等功能
    • 主页
      • 主题切换
      • 部分细节优化
    • ...

    Thanks

    1. 首先感谢gank.io 家的API。
    2. 然后某些界面的设计理念参考(读书人的事情不能用抄)了一些例子。

    相关文章

      网友评论

          本文标题:写了一个Gank客户端

          本文链接:https://www.haomeiwen.com/subject/mskvaxtx.html