美文网首页
retrofit2笔记

retrofit2笔记

作者: 61etj | 来源:发表于2018-10-28 00:31 被阅读0次

导包

//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对象全部切断

相关文章

网友评论

      本文标题:retrofit2笔记

      本文链接:https://www.haomeiwen.com/subject/meoytqtx.html