最近在学Rxjava2,想用它结合网络框架retrofit,做个简单网络请求的demo,主要效果如下:
这里抓取了网络上的一个查询接口,目前demo只展示了几种查询方式,这个可以按照需要进行扩展。
Rxjava使用观察者模式,主要有Observer 观察者,Observable 被观察者,两者通过subscribe()实现订阅关系。
RxJava 的事件回调方法定义了四个方法onNext(),onError() ,onCmplete() onSubscribe()。主要通过onNext()发送事件,在事件处理过程中发生异常时,onError() 会被触发,将不会有事件发出,其中onComplete()和onError()必须唯一并且互斥。
这里定义了一个Observer,处理事件触发的时候执行的操作,主要包括查询成功和失败时的回调:
public abstract class MyObserver<T> implements Observer<LogisticsInfo<T>> {
private Context mContext;
public MyObserver(Context context) {
this.mContext = context.getApplicationContext();
}
@Override
public void onNext(@NonNull LogisticsInfo<T> tLogisticsInfo) {
if (tLogisticsInfo.isSuccess()) {
onHandleSuccess(tLogisticsInfo.data);
} else {
onHandleError(tLogisticsInfo.message);
}
}
@Override
public void onError(@NonNull Throwable e) {}
@Override
public void onComplete() {}
@Override
public void onSubscribe(@NonNull Disposable d) {}
protected abstract void onHandleSuccess(T data);
protected abstract void onHandleError(String message);
}
接着定义了一个基类,这里引入了rxlifecycle,有助于解决rxjava使用过程中引起的内存泄漏,可以根据 Activity 生命周期自动取消订阅。
doOnSubscribeOn ()在开始注册前做一些工作。例如网络状态判断,一些加载loading处理。
public abstract class BaseActivity extends RxAppCompatActivity {
private LoadingView mLoadView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLoadView = new LoadingView(this);
}
protected <T> ObservableTransformer<T, T> compose(LifecycleTransformer<T> lifeCycle) {
return new ObservableTransformer<T, T>() {
@Override
public ObservableSource<T> apply(@NonNull Observable<T> observable) {
return observable.subscribeOn(Schedulers.io()).doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(Disposable disposable) throws Exception {
//显示加载框
if (!Utils.isNetworkAvailable(BaseActivity.this)) {
Toast.makeText(BaseActivity.this, R.string.toast_network_error, Toast.LENGTH_SHORT).show();
}
mLoadView.show();
}
}).observeOn(AndroidSchedulers.mainThread()).doFinally(new Action() {
@Override
public void run() throws Exception {
mLoadView.dismiss();
}
}).compose(lifeCycle);
}
};
}
下面是一个网络请求封装,主要初始化retrofit
public class HttpService {
private static final long TIMEOUT = 30;
private static OkHttpClient client;
private static RetrofitService retrofitService;
private static final String BASE_URL="http://www.kuaidi100.com/";
public static RetrofitService getInstance() {
if (retrofitService == null) {
synchronized (HttpService.class) {
if (retrofitService == null) {
client = new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC))
.connectTimeout(TIMEOUT, TimeUnit.SECONDS)
.readTimeout(TIMEOUT, TimeUnit.SECONDS)
.build();
retrofitService = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build()
.create(RetrofitService.class);
}
}
}
return retrofitService;
}
接口请求service
public interface RetrofitService {
@FormUrlEncoded
@POST("query")
Observable<LogisticsInfo<ArrayList<ExpressInfo>>> getExpress(
@Field("type") String type,
@Field("postid") String postid);
}