Retrofit2+OkHttp3+RxJava2構建當前流行的網絡框架
導入
dependencies {
implementation "com.squareup.okhttp3:okhttp:3.9.1"
implementation "com.squareup.okhttp3:logging-interceptor:3.9.1"
implementation "com.squareup.retrofit2:retrofit:2.3.0"
implementation "com.squareup.retrofit2:converter-gson:2.3.0"
implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
implementation "io.reactivex.rxjava2:rxandroid:2.1.7"
implementation "io.reactivex.rxjava2:rxjava:2.0.1"
}
OkHttp3
public OkHttpClient getNewClient() {
//攔截器
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient;
if(DEBUG)
{
okHttpClient = new OkHttpClient.Builder()
.addInterceptor(logging)
.connectTimeout(TIMEOUT_CONNECTION, TimeUnit.SECONDS)
.writeTimeout(TIMEOUT_WRITE, TimeUnit.SECONDS)
.readTimeout(TIMEOUT_READ, TimeUnit.SECONDS)
.build();
}else
{
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(TIMEOUT_CONNECTION, TimeUnit.SECONDS)
.writeTimeout(TIMEOUT_WRITE, TimeUnit.SECONDS)
.readTimeout(TIMEOUT_READ, TimeUnit.SECONDS)
.build();
}
return okHttpClient;
}
Retrofit2
public Retrofit getRetrofit() {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(GankConstants.HOST)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(getNewClient())
.build();
}
return retrofit;
}
RetrofitManager獲取Retrofit實例
public class RetrofitManager {
public static boolean DEBUG = true;
private Retrofit retrofit;
private static RetrofitManager mHttpUtil;
private RetrofitManager() {
retrofit = getRetrofit();
}
public static RetrofitManager getInstance() {
if (mHttpUtil == null) {
synchronized (RetrofitManager.class) {
if (mHttpUtil == null) {
mHttpUtil = new RetrofitManager();
}
}
}
return mHttpUtil;
}
public Retrofit getRetrofit() {
```
return retrofit;
}
private final int TIMEOUT_READ = 20;
private final int TIMEOUT_CONNECTION = 20;
private final int TIMEOUT_WRITE = 20;
public OkHttpClient getNewClient() {
```
return okHttpClient;
}
}
GankServer(Retrofit 需要去 構建的API接口 )
- 這裏只有@GET,常見還有@POST
- Observable 爲RxJava 的被觀察者 相對於Retrofit將OkHttp的Callback轉化爲Observable
public interface GankServer {
String ANDROID="data/Android/";
@GET(ANDROID+"{page_rows}/{page}")
Observable<GankBean> getAndriod(
@Path("page_rows") int page_rows ,
@Path("page") int page);
```
}
RetrofitHelper
- 統一管理所有API server
public class RetrofitHelper {
private GankServer mGankServer;
public RetrofitHelper() {
mGankServer = RetrofitManager.getInstance().getRetrofit().create(GankServer.class);
}
private static RetrofitHelper mAPIClient;
public static RetrofitHelper getInstance() {
if (mAPIClient == null) {
mAPIClient = new RetrofitHelper();
}
return mAPIClient;
}
public GankServer getGankServer() {
return mGankServer;
}
}
在AndroidModel調用GankServer的getAndroid()
- 調用返回Observable
- 如果在這裏加入請求隊列,需要提供返回結果的接口給AndroidPresenter
public class AndroidModel implements AndroidContract.Model{
private GankServer gankServer;
@Override
public Observable<GankBean> getAndroid(int page_rows,int page){
GankServer gankServer = RetrofitHelper.getInstance().getGankServer();
Observable<GankBean> andriod = gankServer.getAndriod(page_rows, page);
return andriod;
}
}
在AndroidModel調用Observable 請求數據
- (耦合了,更換請求框架麻煩)
- 應該再增加一層接口,更換請求方式(如改爲OkHttp,不使用retrofit),只需修改model層即可
public class AndroidPresenter implements AndroidContract.Presenter{
/**
* 刷新列表
*/
@Override
public void refreshList() {
Observable<GankBean> android = mModel.getAndroid(mPage_rows, 1);//被觀察者
android.subscribeOn(Schedulers.io())//請求發佈在IO線程
.observeOn(AndroidSchedulers.mainThread())//觀察結果在主線程處理
.subscribe(new Observer<GankBean>() {//觀察者
Disposable mDisposable;
@Override
public void onSubscribe(Disposable d) {//發佈中...
mDisposableList.add(d) ;
mDisposable=d;//設置爲false可以切斷上下流,阻斷觀察處理
}
@Override
public void onNext(GankBean gankBean) {//正確處理,與onError互斥
if(mView!=null&&!gankBean.error)
{
mView.refreshListByData(gankBean.results);
}
}
@Override
public void onError(Throwable e) {//錯誤處理,與onNext互斥
if(mView!=null )
{
mView.showErrorView();
}
}
@Override
public void onComplete() {//完成處理在onNext或onError之後
mDisposableList.remove(mDisposable);
}
});
}
}
複用
新增APIServer
- 新增APIServer及獲取數據方法
- 在RetrofitHelper新增getAPIServer()
- 在Model調用RetrofitHelper的getAPIServer()的獲取數據方法獲取Observable
- 在Presenter使用Model的Observable請求數據並處理
在現有APIServer新增獲取數據方法
- 在現有APIServer新增獲取數據方法
- 在Model調用RetrofitHelper的getAPIServer()的獲取數據方法獲取Observable
- 在Presenter使用Model的Observable請求數據並處理(耦合了,更換請求框架麻煩)