Rxjava從使用到原碼的解析十: Rxjava實戰之配合Retrofit請求完註冊接口直接再請求登陸接口

一個註冊和登陸接口

public interface LoginApi {

    @FormUrlEncoded
    @POST("user/login")
    Observable<HttpResult<LoginBean>> login(@FieldMap Map<String, Object> params);


    @FormUrlEncoded
    @POST("user/register")
    Observable<HttpResult<LoginBean>> register(@FieldMap Map<String, Object> params);
}

配置Retrofit

HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor("ancelyOkhttp:");
        httpLoggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.BODY);
        httpLoggingInterceptor.setColorLevel(Level.INFO);
        // 初始化okhttp
        OkHttpClient.Builder builder = new OkHttpClient.Builder()
                .addInterceptor(new ProgressInterceptor())
                .addInterceptor(chain -> {
                    //默認添加 Accept-Language
                    //默認添加 User-Agent
                    Request.Builder builder1 = chain.request().newBuilder();
                    addHeards(builder1);
                    Request request = builder1
                            .addHeader("Content-type", "application/json; charset=utf-8")
                            .addHeader("Accept", "application/json")
                            .build();
                    return chain.proceed(request);
                })
                .addInterceptor(httpLoggingInterceptor)
                .readTimeout(60000, TimeUnit.MILLISECONDS)
                .writeTimeout(60000, TimeUnit.MILLISECONDS)
                .connectTimeout(60000, TimeUnit.MILLISECONDS);
        if (interceptors != null && interceptors.size() > 0) {
            for (Interceptor interceptor : interceptors) {
                if (interceptor != null) builder.addInterceptor(interceptor);
            }
        }
        builder.cookieJar(new CookieManger(getContext()))
                .retryOnConnectionFailure(true);
        if (sslParams != null)
            builder.sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager);

        mClient = builder.build();
        // 初始化Retrofit
        retrofit = new Retrofit.Builder()
                .client(mClient)
                .baseUrl(host)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();

 

獲取Retrofit

public Retrofit getRetrofit() {
        return retrofit;
}

最後執行註冊再登錄

Disposable subscribe = NetWorkManager.getInstance().getRetrofit()
                .create(LoginApi.class)
                //第一步,請求服務器  開始註冊
                .register(new HashMap<>())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                //註冊完之後,更新註冊UI
                .doOnNext(new Consumer<HttpResult<RegisterBean>>() {
                    @Override
                    public void accept(HttpResult<RegisterBean> loginBeanHttpResult) throws Exception {
                        //第二步,註冊成功,更新註冊成功相關UI
                    }
                })
                //馬上去請求登陸請求
                .subscribeOn(Schedulers.io())//給上游戲分配io線程
                .flatMap(new Function<HttpResult<RegisterBean>, ObservableSource<HttpResult<LoginBean>>>() {
                    @Override
                    public ObservableSource<HttpResult<LoginBean>> apply(HttpResult<RegisterBean> registerBeanHttpResult) throws Exception {

                        //這裏可以拿到註冊的信息,然後去執行登錄操作
                        //第三步,馬上去請求登錄操作
                        Observable<HttpResult<LoginBean>> login = NetWorkManager.getInstance().getRetrofit()
                                .create(LoginApi.class)
                                .login(new HashMap<>());
                        return login;
                    }
                })
                //登陸完之後,開始更新登陸UI
                .observeOn(AndroidSchedulers.mainThread())//把線程切換過來
                .subscribe(new Consumer<HttpResult<LoginBean>>() {
                    @Override
                    public void accept(HttpResult<LoginBean> loginBeanHttpResult) throws Exception {                
                          //第四步,登陸成功,更新成功後的UI
                        //這裏就可以操作登陸成功的操作
                    }
                });

 

上面就是一個從上到下的鏈式編程,也叫卡片式編程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章