一個註冊和登陸接口
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
//這裏就可以操作登陸成功的操作
}
});
上面就是一個從上到下的鏈式編程,也叫卡片式編程