RxJava + Retrofit + OkhttpClient 學習
阿新 • • 發佈:2018-12-08
- 首先,建立OkhttpClient 和Retrofit的網路框架
- 其次,建立Retrofit的請求介面
- 最後,通過RxJava監聽觀察者並獲取請求介面的結果。
- 實踐:
/**
* @author zhou.jn on 2018/11/22 13:38.
*/
public class App extends Application {
private static final String TAG = "App";
private static OkHttpClient okHttpClient;
private static Retrofit retrofit;
private static App app;
@Override
public void onCreate() {
super.onCreate();
app = this;
OkhttpInstance();
RetrofitInstance();
}
//1. 建立OkhttpClient
private static OkHttpClient OkhttpInstance() {
if (okHttpClient == null) {
OkHttpClient. Builder builder = new OkHttpClient.Builder()
//設定連結超時時間
.connectTimeout(500, TimeUnit.MILLISECONDS)
//設定讀取超時時間
.readTimeout(1000, TimeUnit.MILLISECONDS)
//設定寫入超時時間
.writeTimeout(1000, TimeUnit.MILLISECONDS)
//設定快取目錄
.cache(new Cache(app.getExternalCacheDir(), 10 * 1024 * 1024))
.build();
});
return okHttpClient;
} else {
return okHttpClient;
}
}
public static Retrofit RetrofitInstance() {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
//新增基礎URL,需要以"/"結尾,例:"http://www.baidu.com/"
.baseUrl(Http.DEFAULT_BASE_URL)
//新增RxJava支援
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
/**新增解析方式(這裡可能會因為解析的方式不同,導致產生404或者解析字串不全的現象*/
.addConverterFactory(ScalarsConverterFactory.create())
.client(okHttpClient)
.build();
return retrofit;
} else {
return retrofit;
}
}
}
2.Retrofit註解中文版:https://www.jianshu.com/p/0fda3132cf98
瞭解@Post @[email protected]@
/**
* @author zhou.jn on 2018/11/22 14:49.
*/
public interface Ipost {
//介面請求,基本的請求要與後臺定義的請求協議一致,例:是否需要新增請求頭等。
String REQUEST_HEAD = "User-Agent";
String GET_IP_TAG = "client/ipinfo";
String REQUEST_PERSONAL = "client/queryOttAccount";
@POST(GET_IP_TAG)
Observable<String> getPublicIp(@Header(REQUEST_HEAD) String headValue);
//請求方式一:需使用拼接的字串進行請求,可以定義拼接字串
@POST(REQUEST_PERSONAL)
Observable<String> queryPersonInfo(@Body String content);
//請求方式二:直接寫全請求介面,此時,將忽略在retrofit中設定的baseUrl 例: Http.DEFAULT_BASE_URL
@POST("http://IP:Port/請求拼接的引數")
Observable<String> queryRechargeInfo(@Body String content);
}
3.進行請求
final Ipost ipost = App.RetrofitInstance().create(Ipost.class);
MySubscriber subscriber = new MySubscriber(httpKey);
ipost.queryPersonInfo(httpEnContent)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
//以下注冊採用其一:
//方式一: 自定義 註冊
.subscribe(subscriber);
//方式二:
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.i(TAG, "onCompleted: ");
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError: "+e.getMessage());
}
@Override
public void onNext(String s) {
Log.i(TAG, "onNext: "+s);
String decryptResult = AESUtils.decryptResult(s,httpKey);
Log.i(TAG,"解密後:"+decryptResult);
}
});
public class MySubscriber extends Subscriber<String> {
private static final String TAG = "MySubscriber";
private String httpKey;
private String decontent;
public String result;
public MySubscriber(String httpKey) {
this.httpKey = httpKey;
}
//相比較,自定義Subscriber 多一個 onStart(),在onNext()之前被呼叫,可以進行一些初始化操作
@Override
public void onStart() {
super.onStart();
Log.i(TAG,"start");
}
@Override
public void onCompleted() {
Log.i(TAG,"completed");
}
@Override
public void onError(Throwable e) {
Log.i(TAG,"onError: "+e.getMessage());
}
@Override
public void onNext(String enString) {
Log.i(TAG, "onNext: "+ enString);
String decryptResult = AESUtils.decryptResult(enString, httpKey);
//獲取請求結果
Log.i(TAG,"decryptResult: "+ decryptResult);
}
}
4.結束