整合MVP+Retrofit2+RxJava2

前面已经学习了MVP和Retrofit2+RxJava2的使用

http://blog.csdn.net/chendi1992/article/details/78112145  MVP

http://blog.csdn.net/chendi1992/article/details/78112183  Retrofit2+RxJava2

也学习了别人的几篇文章

RxJava 2.0 全新来袭

给初学者的RxJava2.0教程

关于RxJava2.0你不知道的事


学习了这一系列的知识,还是挺散的,所以就尝试着搞一个整合MVP+Retrofit2+RxJava2的小demo

既然要遵循MVP的框架模式,首先把框架搭起来


先把依赖的库加进来

    compile 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
    compile 'io.reactivex.rxjava2:rxjava:2.0.1'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0+'
//    compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'


其实这里主要还是Model中使用Retrofit2获取网络数据

先把Retrofit2这块写好

public interface INetApi {

    @GET("api/china")
    Observable<List<WeatherData>> getWData();
}

public class UseRetrofit {


    public static Retrofit retrofit=new Retrofit.Builder()
            .baseUrl("http://guolin.tech/")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build();

    static INetApi iNetApi=retrofit.create(INetApi.class);

//    Observable<List<WeatherData>> observable=iNetApi.getWData();

    public static Observable<List<WeatherData>> getObservable() {
        return iNetApi.getWData();
    }
}

然后我们在Model里使用网络功能

public interface IWeatherModel {

//       负责流和资源的生命周期管理,即退订和释放资源
        Disposable getWeatherData();
}
 

public class MyWeatherModel implements IWeatherModel {


    CallBackModel  callBackModel;
    public MyWeatherModel( CallBackModel callBackModel)
    {
        this.callBackModel=callBackModel;
    }

    @Override
    public Disposable getWeatherData() {

        Observable<List<WeatherData>> observable= UseRetrofit.getObservable();

        Disposable sub=observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<List<WeatherData>>() {
                    @Override
                    public void accept(List<WeatherData> weatherDatas) throws Exception {
                        callBackModel.onSuccess(weatherDatas);
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {

                    }
                });

        return sub;
    }
}


这里面出现了CallbackModel,这是一个回调接口,用来向Presenter传递数据

public interface CallBackModel {

    void onSuccess(List<WeatherData> weatherDatas);
}


有了向Presenter传递数据的接口,我们来看看Presenter怎么来充当View和Model的桥梁的

前面我们学习了Disposable这个类,用来负责流和资源的生命周期管理,退订和释放资源。 如果在请求的过程中Activity已经退出了, 这个时候如果回到主线程去更新UI, 那么APP肯定就崩溃了,需要Disposable  调用它的dispose()方法时就会切断水管, 使得下游收不到事件, 既然收不到事件, 那么也就不会再去更新UI了. 因此我们可以在Activity中将这个Disposable 保存起来, 当Activity退出时, 切断它即可。当有多个Disposable时,管理起来就麻烦了,所以RxJava2提供了一个容器去统一管理这些Disposable,及CompositeDisposable容器,在Presenter来统一管理。

public class BasePresenter {


    //将所有正在处理的Disposable都添加到CompositeDisposable中。统一退出的时候注销观察
    private CompositeDisposable mCompositeDisposable;

    //将网络请求的每一个disposable添加进入CompositeDisposable,再退出时候一并注销
    public void addDisposable(Disposable subscription){

        if (mCompositeDisposable==null||mCompositeDisposable.isDisposed()) {
            mCompositeDisposable=new CompositeDisposable();
        }
        mCompositeDisposable.add(subscription);

    }

    //注销所有请求
    public void unDisposable(){
        if (mCompositeDisposable != null) {
            mCompositeDisposable.dispose();
        }
    }

}

public class WeatherPresenter extends BasePresenter{

    IWeatherView iWeatherView;
    IWeatherModel iWeatherModel;
    

    public WeatherPresenter(IWeatherView iWeatherView)
    {
        this.iWeatherView=iWeatherView;
        iWeatherModel=new MyWeatherModel(callBackModel);
    }

    CallBackModel callBackModel=new CallBackModel() {
        @Override
        public void onSuccess(List<WeatherData> weatherDatas) {

            iWeatherView.hideProgress();
            iWeatherView.getWeatherData(weatherDatas);
        }
    };


    public void getWeatherData() {
        iWeatherView.showProgress();
        addDisposable(iWeatherModel.getWeatherData());
    }
}

Presenter引入了View接口的地址,同时实例化了Model,体现了桥梁的作用。

接下来就是View层的了

public interface IWeatherView {

    void showProgress();
    void hideProgress();
    void getWeatherData(List<WeatherData> weatherData);
}


public class MainActivity extends AppCompatActivity implements IWeatherView{

    @BindView(R.id.text_view)
    TextView textView;
    ProgressDialog progressDialog;
    WeatherPresenter weatherPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        progressDialog=new ProgressDialog(this,ProgressDialog.STYLE_SPINNER);
        weatherPresenter=new WeatherPresenter(this);
        weatherPresenter.getWeatherData();
    }


    @Override
    public void showProgress() {
        progressDialog.show();
    }

    @Override
    public void hideProgress() {
        progressDialog.dismiss();

    }

    @Override
    public void getWeatherData(List<WeatherData> weatherData) {
        StringBuffer stringBuffer=new StringBuffer();

        for (int i=0;i<weatherData.size();i++) {
            stringBuffer.append(weatherData.get(i).getId()+weatherData.get(i).getName());
        }

        textView.setText(stringBuffer.toString());
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
//        取消注册
        weatherPresenter.unDisposable();
    }
}

在OnCreate方法中获取Presenter的实例,并调用了getWeatherData()方法,将Disposable放到容器中。

通过回调获取到数据,并处理显示

在onDestory方法中取消Disposable注册。


别忘了添加网络权限

  <uses-permission android:name="android.permission.INTERNET"/>



这样一个demo就做完了,功能有些简陋,后期会继续深入学习,继续完善。






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值