前面已经学习了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> 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> observable=iNetApi.getWData();
public static Observable> getObservable() {
return iNetApi.getWData();
}
}
public interface IWeatherModel {
// 负责流和资源的生命周期管理,即退订和释放资源
Disposable getWeatherData();
}
public class MyWeatherModel implements IWeatherModel {
CallBackModel callBackModel;
public MyWeatherModel( CallBackModel callBackModel)
{
this.callBackModel=callBackModel;
}
@Override
public Disposable getWeatherData() {
Observable> observable= UseRetrofit.getObservable();
Disposable sub=observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer>() {
@Override
public void accept(List weatherDatas) throws Exception {
callBackModel.onSuccess(weatherDatas);
}
}, new Consumer() {
@Override
public void accept(Throwable throwable) throws Exception {
}
});
return sub;
}
}
这里面出现了CallbackModel,这是一个回调接口,用来向Presenter传递数据
public interface CallBackModel {
void onSuccess(List weatherDatas);
}
前面我们学习了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 weatherDatas) {
iWeatherView.hideProgress();
iWeatherView.getWeatherData(weatherDatas);
}
};
public void getWeatherData() {
iWeatherView.showProgress();
addDisposable(iWeatherModel.getWeatherData());
}
}
接下来就是View层的了
public interface IWeatherView {
void showProgress();
void hideProgress();
void getWeatherData(List 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) {
StringBuffer stringBuffer=new StringBuffer();
for (int i=0;i
通过回调获取到数据,并处理显示
在onDestory方法中取消Disposable注册。
别忘了添加网络权限