Retrofit+OkHttp+RxJava+RxAndroid详解(上)
Retrofit+OkHttp+RxJava+RxAndroid详解(上)_jianning-wu的博客-CSDN博客
上节讲述了Retrofit&OkHttp&RxJava&RxAndroid的基础讲解,显然还有优化的地方,比如OkHttp的详细操作,比如Service的封装,比如线程切换 等等。
下面继续讲解
1.Retrofit管理类
package com.wjn.networkdemo.retrofit.rxjavarxandroid;
import android.text.TextUtils;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
public class RetrofitManager {
private static final int DEFAULT_TIME_OUT = 60;//超时时间 60s
private Retrofit mRetrofit;
private static RetrofitManager retrofitManager = null;
/**
* 构造方法
*/
private RetrofitManager(String baseUrl) {
if (TextUtils.isEmpty(baseUrl) || !(baseUrl.endsWith("/"))) {
return;
}
//配置okHttp的参数
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS)//连接时间
.readTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS)//读时间
.writeTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS)//写时间
.retryOnConnectionFailure(true)//连接失败后是否重新连接
.build();
//获取Retrofit对象
mRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)//设置BaseUrl 必须以'/'结尾
.client(okHttpClient)//设置使用OkHttp请求
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//设置RxJava适配器
.build();
}
/**
* 获取此单例类对象的方法
*/
public static RetrofitManager getInstance(String baseUrl) {
if (null == retrofitManager) {//单例对象为空
synchronized (RetrofitManager.class) {
if (null == retrofitManager) {
retrofitManager = new RetrofitManager(baseUrl);
}
}
}
return retrofitManager;
}
/**
* 获取对应的Service
*/
public <T> T createService(Class<T> service) {
if (null == service) return null;
return mRetrofit.create(service);
}
}
2.自定义Observable
package com.wjn.networkdemo.retrofit.rxjavarxandroid;
import io.reactivex.Observable;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
/**
* 自定义Observable 避免每个Model请求都创建被观察者
*/
public class CustomObservable {
/**
* 创建观察者统一方法
*
* @param observable 被观察者
* @param observableThread 被观察者所在线程
* @param observeThread 观察者所在线程
*/
protected <T> Observable<T> createObservable(Observable<T> observable, ThreadType observableThread, ThreadType observeThread) {
Scheduler observableScheduler = Schedulers.io();//被观察者 默认IO线程
if (observableThread == ThreadType.THREAD_MAIN) {//被观察者设置了其他线程 修改线程
observableScheduler = AndroidSchedulers.mainThread();
}
Scheduler observeSchedulers = AndroidSchedulers.mainThread();//观察者 默认UI线程
if (observeThread == ThreadType.THREAD_NEW) {//观察者设置了其他线程 修改线程
observeSchedulers = Schedulers.io();
}
return observable
.subscribeOn(observableScheduler)
.unsubscribeOn(observableScheduler)
.observeOn(observeSchedulers);
}
}
3.线程管理类
package com.wjn.networkdemo.retrofit.rxjavarxandroid;
/**
* 线程类型
*/
public enum ThreadType {
/**
* 新线程
*/
THREAD_NEW,
/**
* UI线程
*/
THREAD_MAIN,
}
4.Get&Post Presenter
package com.wjn.networkdemo.retrofit.rxjavarxandroid;
public class GetPresenter {
private GetCallBack mGetCallBack;
private GetModel mGetModel;
public GetPresenter(GetCallBack callBack) {
mGetCallBack = callBack;
mGetModel = new GetModel(this);
}
/**
* Get请求
*/
public void getServiceData(String url) {
if (null != mGetModel) {
mGetModel.getServiceData(url);
}
}
/**
* 刷新UI
*/
public void updateServiceUI(FanYiBean bean) {
if (null == mGetCallBack || null == bean) {
return;
}
mGetCallBack.getResult(bean);
}
/**
* 回调
*/
public interface GetCallBack {
void getResult(FanYiBean bean);
}
}
package com.wjn.networkdemo.retrofit.rxjavarxandroid;
import java.util.HashMap;
public class PostPresenter {
public PostCallBack mPostCallBack;
public PostModel mPostModel;
public PostPresenter(PostCallBack callBack) {
mPostCallBack = callBack;
mPostModel = new PostModel(this);
}
/**
* Post请求
*/
public void postServiceData(HashMap map, String url) {
if (null != mPostModel) {
mPostModel.postServiceData(map, url);
}
}
/**
* 刷新UI
*/
public void updateServiceUI(FanYiBean bean) {
if (null == mPostCallBack || null == bean) {
return;
}
mPostCallBack.postResult(bean);
}
/**
* 回调
*/
public interface PostCallBack {
void postResult(FanYiBean bean);
}
}
5.Get&Post Model
package com.wjn.networkdemo.retrofit.rxjavarxandroid;
import android.text.TextUtils;
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import java.io.IOException;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import okhttp3.ResponseBody;
public class GetModel extends CustomObservable {
private GetPresenter mGetPresenter;
public GetModel(GetPresenter presenter) {
mGetPresenter = presenter;
}
/**
* Get请求
*/
public void getServiceData(String url) {
GetService getService = RetrofitManager.getInstance(url).createService(GetService.class);
if (null != getService) {
createObservable(getService.getFanYiByGet(), ThreadType.THREAD_NEW, ThreadType.THREAD_MAIN)
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody value) {
if (null == value) return;
String result = null;
try {
result = value.string();
} catch (IOException e) {
e.printStackTrace();
}
jsonData(result);
}
@Override
public void onError(Throwable e) {
jsonData("");
}
@Override
public void onComplete() {
}
});
}
}
/**
* Json数据解析
*/
private void jsonData(String result) {
Log.d("GetModel", "result----:" + result);
FanYiBean fanYiBean = null;
if (!TextUtils.isEmpty(result)) {
try {
fanYiBean = new Gson().fromJson(result, FanYiBean.class);
} catch (JsonSyntaxException e) {
e.printStackTrace();
}
}
//最终刷新UI
if (null != mGetPresenter) {
mGetPresenter.updateServiceUI(fanYiBean);
}
}
}
package com.wjn.networkdemo.retrofit.rxjavarxandroid;
import android.text.TextUtils;
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import java.io.IOException;
import java.util.HashMap;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import okhttp3.ResponseBody;
public class PostModel extends CustomObservable {
private PostPresenter mPostPresenter;
public PostModel(PostPresenter postPresenter) {
mPostPresenter = postPresenter;
}
/**
* Post请求
*/
public void postServiceData(HashMap map, String url) {
PostService postService = RetrofitManager.getInstance(url).createService(PostService.class);
if (null != postService) {
createObservable(postService.getFanYiByPost(map), ThreadType.THREAD_NEW, ThreadType.THREAD_MAIN)
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody value) {
if (null == value) return;
String result = null;
try {
result = value.string();
} catch (IOException e) {
e.printStackTrace();
}
jsonData(result);
}
@Override
public void onError(Throwable e) {
jsonData("");
}
@Override
public void onComplete() {
}
});
}
}
/**
* Json数据解析
*/
private void jsonData(String result) {
Log.d("PostModel", "result----:" + result);
FanYiBean fanYiBean = null;
if (!TextUtils.isEmpty(result)) {
try {
fanYiBean = new Gson().fromJson(result, FanYiBean.class);
} catch (JsonSyntaxException e) {
e.printStackTrace();
}
}
//最终刷新UI
if (null != mPostPresenter) {
mPostPresenter.updateServiceUI(fanYiBean);
}
}
}
6.测试类
package com.wjn.networkdemo.retrofit.rxjavarxandroid;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import com.wjn.networkdemo.R;
import java.util.HashMap;
public class RetrofitRxJavaRxAndroidActivity extends AppCompatActivity implements GetPresenter.GetCallBack, PostPresenter.PostCallBack {
private String mBaseUrl = "http://fanyi.youdao.com/";
private GetPresenter mGetPresenter;
private PostPresenter mPostPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_retrofit_rxjava_rxandroid);
//Get请求
mGetPresenter = new GetPresenter(this);
findViewById(R.id.activity_retrofit_rxjava_rxandroid_textview1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getData();
}
});
//Post请求
mPostPresenter = new PostPresenter(this);
findViewById(R.id.activity_retrofit_rxjava_rxandroid_textview2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
HashMap<String, String> map = new HashMap<>();
map.put("keyfrom", "imoocdict123456");
map.put("key", "324273592");
map.put("type", "data");
map.put("doctype", "json");
map.put("version", "1.1");
map.put("q", "red");
postData(map);
}
});
}
/**
* Retrofit Get请求
*/
private void getData() {
if (null != mGetPresenter) {
mGetPresenter.getServiceData(mBaseUrl);
}
}
/**
* Retrofit Post请求
*/
private void postData(HashMap<String, String> map) {
if (null != mPostPresenter) {
mPostPresenter.postServiceData(map, mBaseUrl);
}
}
/**
* Get请求回调
*/
@Override
public void getResult(FanYiBean bean) {
if (null == bean) return;
String query = bean.query;
String errorCode = bean.errorCode;
Log.d("Retrofit", "111 Get请求回调 query----:" + query);
Log.d("Retrofit", "111 Get请求回调 errorCode----:" + errorCode);
Log.d("Retrofit", "111 Get请求回调 线程----:" + Thread.currentThread().getName());
}
/**
* Post请求回调
*/
@Override
public void postResult(FanYiBean bean) {
if (null == bean) return;
String query = bean.query;
String errorCode = bean.errorCode;
Log.d("Retrofit", "222 Post请求回调 query----:" + query);
Log.d("Retrofit", "222 Post请求回调 errorCode----:" + errorCode);
Log.d("Retrofit", "222 Post请求回调 线程----:" + Thread.currentThread().getName());
}
}
7.结果
D/Retrofit: 111 Get请求回调 query----:blue
D/Retrofit: 111 Get请求回调 errorCode----:0
D/Retrofit: 111 Get请求回调 线程----:main
D/Retrofit: 222 Post请求回调 query----:red
D/Retrofit: 222 Post请求回调 errorCode----:0
D/Retrofit: 222 Post请求回调 线程----:main