一个很棒的 Android APP框架
来源:互联网 发布:闲鱼如何申请淘宝介入 编辑:程序博客网 时间:2024/06/09 18:53
最近在 github 上看到一个 android 的框架,结合了 Rxjava + retrofit + dagger2 + mvp,结合了当下比较流行的框架,并且项目层次非常清晰,易于扩展和维护
github 地址
项目总览
可以看到项目采用的 MVP 架构(http://xuyushi.github.io/2016/02/28/MVP/)
与常规的 MVP 不同的是,在 modle 层和 view 层通过EventBus 连接,当数据发生变化时,发出对应的 event,注册了这个 event 的 view会采取对应的措施。举个例子,退出登录用在这样的情形就很合适,在退出登录后,我们可能不止一个 view 会发生变化,如果把这些写在每一个 Presenter 中无疑是很不简洁的代码
在 modle 层中,抽象出了一个 DataManger,通过DataManger 我们与数据的具体实现进行了解耦,在 P 层我们无需关注数据是来自 DB ,SP 还是网络。我们只关心拿到的数据对象,而在DataManger 和 具体的数据实现中 还有一层 Helper层,这层封装了对数据的具体操作,比如 DBHelper、SPHelper、RetrofitServie,有了这一层封装可以很方便我们进行扩展。
DataManger 和 Helper累 中的方法拿到的都是 Observeable ,从而方便我们对这个流进行操控。
具体分析
dagger2
项目使用了 dagger2 依赖注入框架解耦个层,使得单测和框架替换变得很容易
ApplicationComponent
首先看ApplicationComponent
,他有一个Moudle
,并且将这个Moudle
中的提供的构造方法暴露出来,可以看到DatabaseHelper、PreferencesHelper等暴露出来的都是全局使用的对象
123456789101112131415
(modules = ApplicationModule.class)public interface ApplicationComponent { void inject(SyncService syncService); Context context(); Application application(); RibotsService ribotsService(); PreferencesHelper preferencesHelper(); DatabaseHelper databaseHelper(); DataManager dataManager(); Bus eventBus();}
###
1234567891011121314151617181920212223242526272829303132
public class ApplicationModule { protected final Application mApplication; public ApplicationModule(Application application) { mApplication = application; } Application provideApplication() { return mApplication; } Context provideContext() { return mApplication; } Bus provideEventBus() { return new Bus(); } RibotsService provideRibotsService() { return RibotsService.Creator.newRibotsService(); }}
可以看到在ApplicationModule
中的 provide 方法暴露出的方法对比ApplicationComponent
中需要的方法,发现还缺了几项。DatabaseHelper
、PreferencesHelper
、DataManager
这是为毛捏? 熟悉 dagger2的小伙伴可能已经明白了
复习 dagger
dagger 创建类实例有2个维度可以创建
- 步骤1:查找Module中是否存在创建该类的方法。
- 步骤2:若存在创建类方法,查看该方法是否存在参数
- 步骤2.1:若存在参数,则按从步骤1开始依次初始化每个参数
- 步骤2.2:若不存在参数,则直接初始化该类实例,一次依赖注入到此结束
步骤3:若不存在创建类方法,则查找Inject注解的构造函数,看构造函数是否存在参数
- 步骤3.1:若存在参数,则从步骤1开始依次初始化每个参数
步骤3.2:若不存在参数,则直接初始化该类实例,一次依赖注入到此结束
因为在使用第三方代码时,我们无法修改源码的构造方法,所以使用 Module 来提供注入构造
所以再回来看DataManager
的构造方法
12345678
public DataManager(RibotsService ribotsService, PreferencesHelper preferencesHelper, DatabaseHelper databaseHelper, EventPosterHelper eventPosterHelper) { mRibotsService = ribotsService; mPreferencesHelper = preferencesHelper; mDatabaseHelper = databaseHelper; mEventPoster = eventPosterHelper; }
用@Inject
标注了构造方法,当注入了DataManager
时,在module
中找不到对应的 provide 方法,变会在构造方法中寻找,在递归的找参数中的注入…
以下用一张图来概括
未完待续。。。。。。。。。。
- 一个很棒的 Android APP框架
- 一个很棒的 Android APP框架
- 一个常用的Android APP框架开发(下)
- 一个android群组通知APP的数据框架
- 一个很棒的caffe框架系列的基础学习博客(网址)
- 一个很棒的BeautifulSoup 的中文文档
- 推荐一个很棒的API搜索引擎
- jarhoo是一个很棒的地方
- 一个很棒的 线程池+缓存 示例
- 一个动画效果很棒的分享按钮。
- Android 个人感觉很棒的一个背景,可以作为标题栏的背景
- android屏幕适配:一个很棒的屏幕适配文章
- 很棒的学习Android 开发的网站
- 一个快速开发APP的框架
- 【Ionic实战】一个和AngularJS的跨平台(iOS,Android) APP框架
- 一个很棒的类似 Facebook 风格的 TextboxList
- 一个很棒的工具来确保成功的投机股票
- 一个关于JTabel的DefaultCellEditor渲染很棒的例子
- Retrofit 使用
- 数字按位倒转
- 工作小技巧-git patch
- 用Table-Selector选出表单数据
- 常用的一些数字的正则表达式验证方法
- 一个很棒的 Android APP框架
- Android数据库SQLite表内设置外键
- RESTFUL API学习教程
- Android应用架构之Retrofit使用
- Python 数据科学入门
- 初读《演说之禅设计篇》有感
- Android之点击回退键俩次退出程序
- Appium移动自动化测试(五)——获取apk的package、activity和element
- 编程珠玑——字符串移位