一个Android app好的构架

一个好的开发框架,就像一个艺术品,这里给大家推荐一个 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<List<Goods>> getSelectGoods(Context context, String key);
    Observable<List<Goods>> 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<List<Goods>> getSelectGoods(Context context, String key){
        return mModel.getSelectGoods(context, key)
                .map(new Func1<List<Goods>, List<Goods>>() {
                    @Override
                    public List<Goods> call(List<Goods> 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技术可以关注我们的微信公众号,扫一扫下方的二维码或搜索关注公共号:


Android老鸟

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值