写了一个Gank客户端

银子

摸鱼用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层就一下子消失了--,所以实际上框架可能实际只是MVp还不是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. 然后某些界面的设计理念参考(读书人的事情不能用抄)了一些例子。
  • BezierViewPager
  • GankClient
  • UGank

你可能感兴趣的:(写了一个Gank客户端)