本篇小说代码引用GitHub上zhihu项目,https://github.com/yiyibb/Zhihu。在此处跟初学者强烈推荐一下,这一个类型功用纵然简易,只是一个粗略阅读功效,可是自己很佩服开发者的代码封装能力,做的真得很周密。选拔的是MVP+retrofit+rxjava架构。前天重点看她的架构分析。

MVP

俺们在初学android的时候,用的架构都是MVC,何为MVC呢。model,view,control。一句话来说model就是数据层,view就是activity,control就是逻辑处理。
发端学的MVC很简单了然,所有层都能在activity上观察,逻辑也很简单看清。activity可以和model,view两者相互接触。但与此同时也拉动一定的麻烦,耦合性太大。你想啊,只要activity改动很不难牵连到方面,而且activity义务量也正如大。
透过从MVC衍生出MVP,MVP很大程度上化解了耦合性的题目,view层不再能一贯触及model,我感觉到那么些理应是最大的长处。当然还有任何优势,比如更有益进行单元测试等等。具体的网上查一查就清楚了。

retrofit+rxjava

一个是网络请求,一个是异步处理,由于本文紧要讲架构分析,那个用法不会赘述。推荐读者看一看开发者抛物线的篇章。上边说过了本人是援引旁人的代码,其实刚开首我用的就是MVC开发方式,没有任何坚守他的写。很差劲,重构代码真的很棘手。当初也只是想亲肉体会一下多个架构的区分,结果越整越乱,重点是自己并不是很熟识MVP的布局模型

架构搭建

先是分析一下效果,从api获得json数据,然后用retrofit初始解析,得到多少后用rxjava更新UI集合。来看望全部架构,代码是从项目里摘出来的,功效也早已落到实处,链接如下https://github.com/ZhangPeng0220/MVP\_Retrofit\_Rxjava

image.png

完整有一个mvp架构放在了
mvp_base文件夹里面,drawerMvp是完整项目标一个侧滑栏模块,DrawerMainContract类里带有了drawer模块必要的model,view,presenter。api是model数据连接,common里也是一些基类。接下来可以分段分析。

json,Drawer MVP模块

那边根本介绍DrawerMainContract接口类

public interface DrawerMainContract {

    interface Model extends BaseModel {
        Observable<ThemesEntity> getOtherThemeList();
    }

    interface View extends BaseView {
        void loadOtherThemeList(ThemesEntity themesEntity);
    }

    abstract class Presenter extends BasePresenter<Model,View> {
        abstract void getOtherThemes();
    }
}

此处有着最后的实体类,都会促成DrawerMainContract中的接口。比如mainactivity会完毕view接口

View

此地的view层总而言之就是mainActivity

public class MainActivity extends BaseFrameActivity<DrawerMainPresenter,DrawerMainModel> implements BaseView, DrawerMainContract.View{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mPresenter.getOtherThemes();
    }

    @Override
    public void loadOtherThemeList(ThemesEntity themesEntity) {
        //处理返回结果
        themesEntity.getLimit();
    }
}

BaseFrameActivity继承自BaseActivity,除了拥有activity的形似生命周期方法以外,它还重点完结了model和presenter的实例化。

public abstract class BaseFrameActivity<P extends BasePresenter, M extends BaseModel> extends BaseActivity implements BaseView{
    public P mPresenter;

    public M mModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPresenter = TUtil.getT(this, 0);
        mModel = TUtil.getT(this, 1);
        if (this instanceof BaseView) {
            mPresenter.attachVM(this, mModel);
        }
    }
    @Override
    protected void onDestroy() {
       /// if (mPresenter != null) mPresenter.detachVM();
        super.onDestroy();
    }


}

实例化是经过工具类
TUtil已毕的,具体代码请读者移步上文的GitHub地址。那里须要专注的有七个点:
率先个是泛型限制,传入的presenter和model都有父类限制。
其次个要求小心的是,在view层只会接触到presenter,不会触发model,为何那边还要实例化model。那里的model实例其实为presenter准备的。mPresenter.attachVM(this,
mModel)
那句话是主要。
其三个是baseview那里是空的,那里可以放一些为主的不二法门,比如initview,initdata

Presenter

public abstract class BasePresenter<M, V>  {
    public M mModel;
    public V mView;

    public void attachVM(V v, M m) {
        this.mModel = m;
        this.mView = v;

    }

    public void detachVM() {
        //mRxManager.clear();
        mView = null;
        mModel = null;
    }
}

BasePresenter紧要用于刚刚view和model的实例化。由于那么些类有实体方法没有采纳接口。接下来就是DrawerMainContract.Presenter继承了这么些抽象方法,具体贯彻类是DrawerMainPresenter

public class DrawerMainPresenter extends DrawerMainContract.Presenter{

    @Override
     public void getOtherThemes() {
        mModel.getOtherThemeList()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<ThemesEntity>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                       // mView.onRequestError("数据加载失败ヽ(≧Д≦)ノ");
                    }

                    @Override
                    public void onNext(ThemesEntity themesEntity) {
                        mView.loadOtherThemeList(themesEntity);
                    }
                });
    }
}

mModel.getOtherThemeList()那几个点子是属于model层的,会回到一个Observable对象,那就属于RxJava的情节了,当得到了现实数目,会在onNext方法里面调用view更新数据的点子,此时mView已经在BaseFrameActivity中的mPresenter.attachVM方法实例化了。

Model

这一层重大是用来连接数据,调用数据。

public class DrawerMainModel implements DrawerMainContract.Model{
    @Override
    public Observable<ThemesEntity> getOtherThemeList() {
        return Networks.getInstance().getThemeApi().getThemes();
    }
}

DrawerMainModel已毕的接口没啥可讲的,方法可以看一看

public MyService getThemeApi() {
        return mThemeApi == null ? configRetrofit(MyService.class) : mThemeApi;
    }

    private <T> T configRetrofit(Class<T> service) {
        retrofit = new Retrofit.Builder()
                .baseUrl("http://news-at.zhihu.com")
                .client(configClient())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        return retrofit.create(service);
    }

    private OkHttpClient configClient() {
        OkHttpClient.Builder okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
        return okHttpClient.build();
    }

那是network里面的完毕形式,getThemeApi()方法重假若获得myservice的实例,继而调用myservice中的getThemes(),得到json数据。

总结

总体流程就是上面得了,其实不算难,不过作者的卷入风格我比较喜欢。流程图如下。可以看出
和MVC相相比较是清楚了重重。

image.png

感兴趣的同室可以关切一下自己的微信公众号,或者微信搜索 开发
Android的小学生

公众号.jpg

相关文章

网站地图xml地图