MVP架构实现的Github客户端(1-准备工作)
系列文章:
1-准备工作
2-搭建项目框架
3-功能实现
4-加入网络缓存
承上关于App重构的几个方面主要也是说的架构重构, 本系列尝试以开发一个Github客户端为例, 记录个人在开发一个App项目过程中的一个基本流程, 以及所采用的架构, 技术的运用, 在此过程也会说明下如何规避上文提到的一些代码,架构等问题.
1, 架构选择
毋庸置疑, MVP架构是目前开发Android App最火的架构, 可能MVVM更加吸引人, 但是MVP更加成熟且易于上手. 相比与Activity/Fragment包揽一切的传统开发架构又更加灵活, 便于产品的更新迭代(特别是UI上的变化, 你懂的, 这也是产品们最喜欢变动的部分).
故此次开发的Github客户端将采用MVP架构:
mvp-architecture
- Model
- 对外提供业务数据API.
- 内部实现本地数据, 网络数据的存取等.
- 只有Presenter可以访问, 与View隔离
- Presenter
- 持有View对象, 对View进行操作
- 持有Model层提供的数据接口对象, 可通过依赖注入解耦此部分.
- 从数据接口对象中获取数据并处理, 更新View.
- View
- UI层, 包含所有UI相关组件.
- 持有对应的Presenter的对象, 可通过依赖注入解耦此部分.
- 由Presenter来负责更新UI.
2, 服务器API熟悉
当前大部分的App是需要与服务器交互的, 在开发之前, 我们也需要简单了解下Github提供的API.
因为Github提供了详尽的开发指南, 在此就不详述了.
值得一提的是, Github API的标准的Restful架构的API, 这个是大赞的~
3, 开源库选择
快速开发一个项目, 且抱着不重复造轮子的思想, 选择一些开源库辅助开发是很必要的. 当然, 同类的开源库可能很多, 选择上可能更多是个人喜好和使用习惯的问题, 在此不做比较(可以哪天单立个开源库选择的话题讨论下).
以下根据个人经验和当前项目的情况初步选择的一些库:
网络请求
- Retrofit
- OkHttp
图片加载
图片加载的库也有很多, 老牌的UIL(Universal-Image-Loader), google推的Glide, Square组织的Picasso, 以及facebook新晋的Fresco.
各有千秋, 关于这几个的比较可以参考StackOverFlow上的这个问题.
在此个人选择Glide.
- Glide
- 另外, 个人习惯, 为了拥抱变化, 我会在Glide的基础上再封装一层, 以便可以很方便的替换成其他的库. 如下:
public class ImageLoader {
public static void load(Context context, Uri uri, ImageView view) {
Glide.with(context)
.load(uri)
.centerCrop()
.into(view);
}
}
如需替换成Picasso, 仅仅修改ImageLoader这个文件即可, 由于Picasso的调用方式和Glide几乎一样, 我们要做的可能只是将Glide换成Picasso而已, 如下:
// 将Glide换成Picasso
// Glide.with(context)
Picasso.with(context)
...
Rx支持
- RxJava
- 一个使用Observable序列实现包含异步和基于事件的编程方式框架。
- 扩展自观察者模式,实现数据、事件序列,并提供了很多Operators可以随意转换Observable,而无需顾虑线程安全,并发同步等。
- 源码地址
- 官方教程
- 给 Android 开发者的 RxJava 详解
- ReactiveX文档中文翻译
- Awesome-RxJava
- RxAndroid
- RxLifecycle
- RxBinding
- Jake大神的大作, 用来将View的事件转换成Rx模式 (大家可以跟随项目见证它的妙处).
- 源码地址
依赖注入
这个一般会选择大名鼎鼎的Dagger了, 现在使用的基本都是google fork修改之后的Dagger2.
数据库相关
这个也有很多选择, 个人一般使用GreenDAO, 主要是其编译生成类文件, 比较清晰, 便于看清原理.
另外, 最近Realm, 极其火爆, 说是基于移动设备打造的数据库, 抛弃SQLite的存在, 可以在练手项目中尝试下.
辅助
还有项目过程中还会根据实际情况增减一些库, 到时再说.
另外可能会引入一些注入自定义View, 动画等相关的库, 也是根据产品的实际情况而定.
至此, 一个App项目的前期工作基本就绪了(当然, 这个是作为一个简单的自研项目而言, 如果是公司产品, 还需更多的产品方面的准备, 在此单论技术方面).
接下来, 就会开始搭建项目框架了, 敬请期待.