导包
//retrofit
compile 'com.squareup.retrofit2:retrofit:2.1.0'
//Gson converter
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
//RxJava2 Adapter 适配rxjava2与retrofit2
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
//okhttp
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
定义请求接口
public interface Api {
@GET
Observable<LoginResponse> login(@Body LoginRequest request);
@GET
Observable<RegisterResponse> register(@Body RegisterRequest request);
}
创建Retrofit客户端
private static Retrofit create() {
OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
builder.readTimeout(10, TimeUnit.SECONDS);//读取超时
builder.connectTimeout(9, TimeUnit.SECONDS);//链接超时
if (BuildConfig.DEBUG) {//gradle构建模式
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();//日志工具
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);//日志等级 完整打印
builder.addInterceptor(interceptor);
}
return new Retrofit.Builder().baseUrl(ENDPOINT)
.client(builder.build())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
创建请求实体
Api api = retrofit.create(Api.class);//创建
api.login(request)//调用,返回一个被观察者
.subscribeOn(Schedulers.io()) //在IO线程进行网络请求
.observeOn(AndroidSchedulers.mainThread()) //回到主线程去处理请求结果
.subscribe(new Observer<LoginResponse>() {
@Override
public void onSubscribe(Disposable d) {}
@Override
public void onNext(LoginResponse value) {}
@Override
public void onError(Throwable e) {
Toast.makeText(mContext, "登录失败", Toast.LENGTH_SHORT).show();
}
@Override
public void onComplete() {
Toast.makeText(mContext, "登录成功", Toast.LENGTH_SHORT).show();
}
});
问题
网络请求在子线程,如果数据请求结束后,activity已经死亡,这个时候更新数据则应用会崩溃
解决方案
在activity中保存Disposable切断,并在onDestory中将 Disposable切断
问题
如果有多个Disposable需要切断,则挨个切断很麻烦
解决方案
rxjava内置CompositeDisposable,此为Disposable容器,帮助我们管理Disposable对象
当得到Disposable的时候调用CompositeDisposable。add(Disposable disposable)
将Disposable对象保存进容器,在退出的时候可以调用CompositeDisposable.clear()
将容器内Disposable对象全部切断
网友评论