Rxjava實現網絡請求
與OkHttp結合進行網絡通信
OkHttp是一個第三方類庫,用於Android中請求網絡。
OkHttp官網
github源碼
實現:
1)通過 Observable.create() 方法,調用 OkHttp 網絡請求;
2)通過 map 操作符集合 gson,將 Response 轉換爲 bean 類;
3)調度線程,在子線程中進行耗時操作任務,在主線程中更新 UI ;
代碼:
Observable.create(new ObservableOnSubscribe<Response>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Response> e) throws Exception {
Builder builder = new Builder()
.url("http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=hello%20world")
.get();
Request request = builder.build();
Call call = new OkHttpClient().newCall(request);
Response response = call.execute();
e.onNext(response);
}
}).map(new Function<Response, Translation>() {
@Override
public Translation apply(@NonNull Response response) throws Exception {
Log.e(TAG, "map 線程:" + Thread.currentThread().getName() + "\n");
if (response.isSuccessful()) {
ResponseBody body = response.body();
if (body != null) {
Log.e(TAG, "map:Json轉換前:" + response.body());
return new Gson().fromJson(body.string(), Translation.class);
}
}
return null;
}
}).observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Translation>() {
@Override
public void accept(@NonNull Translation data) throws Exception {
Log.e(TAG, "subscribe 線程:" + Thread.currentThread().getName() + "\n");
Log.e(TAG, "成功:" + data.getContent().getOut() + "\n");
}
});