美文网首页Android-RxJava实用控件安卓技巧
伸手党福利:Rxjava Subscriber 网络访问回调封装

伸手党福利:Rxjava Subscriber 网络访问回调封装

作者: _deadline | 来源:发表于2016-11-14 19:25 被阅读2012次

你是否还这样写网络请求(那你就走远了):

        view.showProgress();
        subscription = Order().search(new ParamsBuilder().put("xxxxx","xxxxx").build())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<Response>() {
                    @Override
                    public void call(Response response) {
                        view.hideProgress();
                        if (response.isSuccess())
                            view.xxxxxxxxxx(response.getList());
                        else view.showError(response.getMsg());
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable e) {
                        e.printStackTrace();
                        view.hideProgress();
                        view.showErrorMessage(e.getMessage());
                    }
                });
xxxxx.addSubscription(subscription);

其中view是MVP模式 中activity/fragment的接口

我封装的代码:

/**
 * the base response callback entity
 * Created by deadline on 16/8/8.
 *
 * onFinish()方法一定会被调用
 */
 public abstract class OnRequestCallback<T extends Response> extends Subscriber<T> {

    public abstract void onFailed(int code, String message);

    public abstract void onException(String message);

    public abstract void onResponse(T response);

    public abstract void onFinish();

    @Override
    public void onStart() {
        if (!NetUtil.isConnected()){
                onFailed( -1, App.getContext().getString(R.string.network_unavailable));
                onFinish();
                unsubscribe();
                return;
        }
    }

    @Override
    public final void onCompleted() {
        onFinish();
    }

    @Override
    public final void onError(Throwable e)
    {
        onException(e.getMessage());
        onFinish();
    }

    @Override
    public final void onNext(T response)
    {
        if(response.isSuccess())
        {
            onResponse(response);
        }else {
            onFailed(response.getCode(), response.getMessage());
        }
    }
}

/**
 * 不需要展示进度框的网络请求, 但是出现错误会提示
 * 如果你想使用其他方式展示错误信息, 回调里重写方法即可
 * 该类是abstract的.
 * T.showLong(); 是toast的工具类
 * Created by deadline on 16/8/8.
 */

public abstract class OnSimpleRequestCallback<T extends Response> extends OnRequestCallback<T> {
    @Override
    public void onStart() {
        super.onStart();
    }


    @Override
    public void onFinish() {

    };

    @Override
    public void onFailed(int code, String message){
        T.showLong(message);
    };

    @Override
    public void onException(String message){
        T.showLong(message);
    };
}

/**
 * 需要展示进度框的网络访问
 *
 * 如果在onResponse/onFailed/onException 任何一个方法里调用了BaseView.finish
 * 可能activity无法及时释放,因为OnProgressRequestCallback还持有view,
 * 因此在使用的时候注意,如果有以上情况,请在finish activty
 * 之前调用  OnProgressRequestCallback.onFinish ,
 * 不调用也没关系,因为是WeakReference<BaseView>.
 *
 * Created by deadline on 16/8/8.
 */
public abstract class OnProgressRequestCallback<T extends Response>
                                        extends OnSimpleRequestCallback<T>{

    private WeakReference<BaseView> reference;

    public OnProgressRequestCallback(BaseView baseView){
        reference = new WeakReference<BaseView>(baseView);
    }

    /**
     * 注意这里代码顺序一定不能错
     */
    @Override
    public void onStart() {
        reference.get().showProgress();
        super.onStart();
    }

    /**
     * onFinish()一定会被调用
     */
    @Override
    public void onFinish() {
        reference.get().hideProgress();
    }
}

如何用:

没错就这样用:

不用关心错误/异常提醒,

不用关心网络未连接提醒,

不用关心progressDialog显示隐藏.

不用谢我,能用到,就拿走。别忘了点个赞!

            xxxxx
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new OnProgressRequestCallback<Response>(mView) {
                    @Override
                    public void onResponse(Response response) {
                        
                    }
                });

Response类:

public class Response {

    private String message;

    private int code;

    public boolean isSuccess(){
        return code == 0;
    }


    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }
}

相关文章

网友评论

  • DevCW:没意思
  • bc1ff59c5b30:很一般
  • vipheyue:在B 页面进行了耗时操作的过程中 退出了 B 页面...会导致泄露.而且耗时操作执行完了之后回调给 B 页面..而B 页面已经 destory .导致出错
    _deadline:@vipheyue Subscription 你要自己接受处理释放,我这只是个回调接口!
  • 薄炳鑫:这样onfinish会执行两次吧。
    _deadline:@薄炳鑫 你是对的,我把onNext()里的onfinish拿掉了,再次感谢!
    薄炳鑫:@_deadline onComplete和onNext的时候都调用了onFinish()
    _deadline:@薄炳鑫 不会啊,你为什么觉得会执行两次?
  • 梦华芳秋:作为一名开发者,最近深深体会到重复造轮子的痛苦了!最好的开发来自借鉴和吸收别人的优秀成果!
    _deadline: @梦华芳秋 谢谢支持
  • Android之路:博主,在onstart()的super,onstart()之前是主线程吗?
    _deadline: @Android之路 你可以试一试,之前我也疑问过这个问题,看了源代码确实是在哪个线程注册,就在哪个线程执行onstart,其实主要网络访问都在ui线程,如果实在觉得会用到问题,用handler简单处理下就行!
    Android之路:@_deadline 可是在io线程中调用对话框 会有问题吧..
    _deadline: @Android之路 是这样的rxjava代码中你在哪个线程里subscribe()的onstart(就在哪个线程调用)

本文标题:伸手党福利:Rxjava Subscriber 网络访问回调封装

本文链接:https://www.haomeiwen.com/subject/scjtpttx.html