一个好的开发框架,就像一个艺术品,这里给大家推荐一个 android 的框架,使用 Rxjava + retrofit + dagger2 + mvp,结合了当下比较流行的框架,项目层次非常清晰,易于扩展和维护。
与常规的 MVP 不同的是,在 modle 层和 view 层通过EventBus 连接,当数据发生变化时,发出对应的 event,注册了这个 event 的 view会采取对应的措施。比如,登录或退出登录用在这样的情形就很合适,在登录或退出登录后,我们可能不止一个 view 会发生变化,如果把这些写在每一个 Presenter 中无疑是很不简洁的代码。
在 modle 层中,抽象出了一个 DataManger,通过DataManger 我们与数据的具体实现进行了解耦,在 P 层我们无需关注数据是来自 DB ,SP 还是网络。我们只关心拿到的数据对象,而在DataManger 和 具体的数据实现中 还有一层 Helper层,这层封装了对数据的具体操作,比如 DBHelper、SPHelper、RetrofitServie,有了这一层封装可以很方便我们进行扩展。
在Presenter层与Model层的数据传递交互我这里也是尽量使用RxAndroid/RxJava,这样做是为了尽量避免回调方面,回调接口,通常都是不易于阅读的,并且如果有多级嵌套就更是一个噩梦。
dagger2依赖注入框架的使用,也是进一步解耦,比如上图里面,view层与presenter解耦,DataManager与Model的解耦。
public interface IxxxModel{
Observable> getSelectGoods(Context context, String key);
Observable> getGoodsPrice(Context context, String skuIds);
}
比如上面是某个Model的接口,获取商品和价格,具体接口实现这里省略,可以是网络获取等等,关键点是上面接口返回的是一个Observable被观察者,这里使用的是RxJava,避免使用回调
public class DataManager {
@Inject
IxxxModel mModel;
private DataManager(){
DaggerDataManagerComponent
.builder()
.dataManagerModule(new DataManagerModule())
.build()
.inject(this);
}
public static DataManager getInstance(){
return Holder.INSTANCE;
}
private static class Holder{
public static final DataManager INSTANCE = new DataManager();
}
public IxxxModel getxxxModel(){
return mModel;
}
}
上面是DataManager ,它是一个单例,提供了IxxxModel的实例,注意IxxxModel的实例并不是直接在这里new出来的,是通过Dagger2依赖注入框架注入的,这里不做Dagger2详细介绍,我之前一篇文件对Dagger2使用已做示例。
public class xxxActivityPresenter implements IxxxActivityPresenter{
private IxxxActivityView mView;
private IxxxModel mModel;
public xxxActivityPresenter(IxxxActivityView view){
mView = view;
mModel = DataManager.getInstance().getxxxModel();
}
Observable> getSelectGoods(Context context, String key){
return mModel.getSelectGoods(context, key)
.map(new Func1, List>() {
@Override
public List call(List goodsList) {
//对结果进行中间处理
......
......
return goodsList;
}
});
}
上面利用Rxjava在Presenter里面很方便进行对结果做中间处理,或更新view。
public class xxxActivity extends BaseActivity implements IxxxActivityView{
@Inject
public xxxActivityPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
//依赖注入mPresenter实例
DaggerxxxActivityComponent
.builder()
.circleDetailBaseActivityModule(new xxxActivityModule(this))
.build()
.inject(this);
EventBus.getDefault().register(this);
}
}
这样activity里面就可以很方便操作Presenter对象了。
上面所涉及到的各个框架,如EventBus,Dagger2, RxAndroid等这些知识点,这篇文章都没有讨论它们如何使用,因为这些知识点都比较复杂,需要单独开篇讲解,这里只简单说说这个app框架的大致构架。
完
更多精彩Android技术可以关注我们的微信公众号,扫一扫下方的二维码或搜索关注公共号: