银子
摸鱼用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'
一点点总结
- 关于Dagger2的依赖注入,看到一些github上的同级别项目,并没有将Dagger这一流痞的库很好的使用他们在Activity中仍然很多
new Clazz();
。为此,我强化了Dagger的使用,致使项目中MVP中的P层使用依赖注入到Activity\Fragment,同时很多的View要么使用ButterKnife,要么使用Dagger注入到相应位置,使得在项目中基本看不到new Clazz();
这种方法。 - 关于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应该是没问题的。
- Rx系函数式编程。函数式编程、响应式编程我了解比较浅,对于这种编程思想来说,一个函数的输出作为另一种函数的输入。函数相互调用形成一种链状的“流”。这与观察者模式不谋而合,通过对这种思想的使用,使得整个工程结构更加清晰,我们只需关注每个函数流的流向即每个函数的功能,将每个逻辑单独抽离,而不关注具体的实现,这使得项目更加清晰,也符合OOP的原则、高内聚低耦合。
- 关于自定义View,至今,据我了解,Android从业者呈现一种金字塔形势分布,较为低级的人员充斥在这个市场当中,但越往上的能力者越少。我也在想从13年移动行业的井喷式增长开始,到18年我该毕业的今天,拥有5年左右的开发者,他们在整个行业中处于什么样的地位,他们拥有怎样的技能树。我遇到的人,还是较少,暂不能得到答案。但以不变应万变,基础的东西的变化仍然是较低的,对于自定义View的掌握肯定是必要的。如今开发,想要获得一个效果,搜一下第三方库就很多。虽不要重复早轮子,但是前提是会造轮子。不需要知道细枝末节,但是对于脉络原理还是要知道的。为此学习一些自定义View是很必要的。我在这个项目中实现了一个贝塞尔拟合圆的ViewPager指示器,实际挺简单,300行左右的代码但是对于自定义View的收获还是挺多的。
- MD,Material Design是一种设计风格,与IOS的扁平化相对应。目前大部分的App,还是喜欢和IOS对齐,这也没错。我所了解的App中Android端的BiliBili、网易云等对于MD的应用最为出色。可能我们不是写UI的不需要设计的很好看,但是去发现美(无论是何种美)确实应该去做的。
- 。。。
TODO
- IMG
- ImageViewWrap,手势包装类的优化
- 妹子图的下载收藏等
- Web
- CustomTab的集成,获取更好体验
- 右上角分享、复制URL等功能
- 主页
- 主题切换
- 部分细节优化
- ...
Thanks
- 首先感谢gank.io 家的API。
- 然后某些界面的设计理念参考
(读书人的事情不能用抄)了一些例子。