使用Rxjava2+Retrofit实现简单的快递查询

最近在学Rxjava2,想用它结合网络框架retrofit,做个简单网络请求的demo,主要效果如下:

使用Rxjava2+Retrofit实现简单的快递查询_第1张图片
使用Rxjava2+Retrofit实现简单的快递查询_第2张图片

这里抓取了网络上的一个查询接口,目前demo只展示了几种查询方式,这个可以按照需要进行扩展。

Rxjava使用观察者模式,主要有Observer 观察者,Observable 被观察者,两者通过subscribe()实现订阅关系。

RxJava 的事件回调方法定义了四个方法onNext(),onError() ,onCmplete() onSubscribe()。主要通过onNext()发送事件,在事件处理过程中发生异常时,onError() 会被触发,将不会有事件发出,其中onComplete()和onError()必须唯一并且互斥。

这里定义了一个Observer,处理事件触发的时候执行的操作,主要包括查询成功和失败时的回调:

 public abstract class MyObserver implements Observer> {
    private Context mContext;
    public MyObserver(Context context) {
        this.mContext = context.getApplicationContext();
    }

    @Override
    public void onNext(@NonNull LogisticsInfo 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  ObservableTransformer compose(LifecycleTransformer lifeCycle) {
    return new ObservableTransformer() {
        @Override
        public ObservableSource apply(@NonNull Observable observable) {
            return observable.subscribeOn(Schedulers.io()).doOnSubscribe(new Consumer() {
                @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>> getExpress(
            @Field("type") String type,
            @Field("postid") String postid);

}

代码下载

学习参考

给Android开发者的RxJava详解
可能是东半球最全的RxJava使用场景小结
深入浅出RxJava
RxJava大搜集

你可能感兴趣的:(Android开发,网络)