今天來分享一下Retrofit2+RxJava2+OkHttp3的封裝蛔外。
第一步 - 那自然是引用相關(guān)的庫:
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
// gson解析溯乒,可以自行替換
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
// 日志的攔截器,也可以自行選擇
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
第二步裆悄,我們在Application創(chuàng)建一個OkHttpClient:
public class MyApplication extends Application {
private static final int TIMEOUT_READ = 15;
private static final int TIMEOUT_CONNECTION = 15;
private static OkHttpClient mOkHttpClient;
public OkHttpClient genericClient() {
if (mOkHttpClient != null)
return mOkHttpClient;
HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor();
HttpLoggingInterceptor.Level level = BuildConfig.IS_DEBUG ?
HttpLoggingInterceptor.Level.HEADERS :
HttpLoggingInterceptor.Level.NONE;
logInterceptor.setLevel(level);
return mOkHttpClient = new OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.addInterceptor(logInterceptor)
.addNetworkInterceptor(new CacheInterceptor())
.readTimeout(TIMEOUT_READ, TimeUnit.SECONDS)
.connectTimeout(TIMEOUT_CONNECTION, TimeUnit.SECONDS)
.build();
}
}
創(chuàng)建好了光稼,先放著等后面需要使用。
第三步艾君,創(chuàng)建一個BaseApi類:
該類有兩個主要職責(zé)采够,1.負(fù)責(zé)創(chuàng)建Retrofit的實例;2.執(zhí)行網(wǎng)絡(luò)請求腻贰。
public class BaseApi {
// 創(chuàng)建網(wǎng)絡(luò)接口請求實例
public static <T> T createApi(Class<T> service) {
final String url = KEY_BASE_URL;
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
// 注意這里使用了剛才在application里提供創(chuàng)建okhttp的方法
.client(MyApplication.getApplication().genericClient())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
return retrofit.create(service);
}
// 執(zhí)行網(wǎng)絡(luò)請求
public static <T> void request(Observable<T> observable,
final IResponseListener<T> listener) {
if (!NetUtils.isConnected(MyApplication.getApplication())) {
ToastUtils.getInstance().showToast("網(wǎng)絡(luò)不可用,請檢查網(wǎng)絡(luò)");
if (listener != null) {
listener.onFail();
}
return;
}
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<T>() {
@Override
public void onError(Throwable e) {
e.printStackTrace();
LogUtils.d("onError", e.getMessage());
if (listener != null) {
listener.onFail();
}
}
@Override
public void onComplete() {
}
@Override
public void onSubscribe(Disposable disposable) {
}
@Override
public void onNext(T data) {
if (listener != null) {
listener.onSuccess(data);
}
}
}
);
public interface IResponseListener<T> {
void onSuccess(T data);
void onFail();
}
}
這樣一個封裝就完成了,下面我用demo來測試一下效果:
public class MainActivity extends AppCompatActivity {
private TextView tvTest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvTest = (TextView) findViewById(R.id.tv_test);
BaseApi.request(BaseApi.createApi(IServiceApi.class).getBookInfo(),
new BaseApi.IResponseListener<Book>() {
@Override
public void onSuccess(Book data) {
tvTest.setText(data.summary);
}
@Override
public void onFail() {
}
});
}
}
效果就不演示了冀瓦,放出 demo大家可以下載看看。