如何使用 lambda 提取 rxjava 的 onError 方法

How can I extract onError method of rxjava by using lambda

我有一个网络请求:

userApi.getUserInfoByUid (AuthUtils.getUid (ctx), AuthUtils.getToken (ctx))
            .doOnNext (u -> saveToCache (u))
            .observeOn (AndroidSchedulers.mainThread ())
            .subscribe (u -> {
                if (updateListener != null)
                    updateListener.onUpdate (u);
            },e->{
                Toast.makeText (ctx,"network error",Toast.LENGTH_SHORT).show ();
            });

你知道,很多请求可能有网络错误,所以我提取了 OnError() 方法。如:

 abstract class Mysubscrib<T> extends Subscriber<T>{

    @Override
    public void onCompleted() {
        //do nothing
    }

    @Override
    public void onError(Throwable e) {
        Toast.makeText (ctx,"network error",Toast.LENGTH_SHORT).show ();
    }
}

    userApi.getUserInfoByUid (AuthUtils.getUid (ctx), AuthUtils.getToken (ctx))
            .doOnNext (u -> saveToCache (u))
            .observeOn (AndroidSchedulers.mainThread ())
            .subscribe (new Mysubscrib<UserInfo> () {
                @Override
                public void onNext(UserInfo userInfo) {
                    if (updateListener != null)
                        updateListener.onUpdate (userInfo);
                }
            });

但是如果我这样做,我就不能使用 lambda,感觉 bad.how 我可以使用:

userApi.getUserInfoByUid (AuthUtils.getUid (ctx), AuthUtils.getToken (ctx))
            .doOnNext (u -> saveToCache (u))
            .observeOn (AndroidSchedulers.mainThread ())
            .subscribe (u->{
                if (updateListener != null)
                    updateListener.onUpdate (u);
            });

不幸的是,java 及其 lambda 表达式不允许执行此类操作。解决它的最简单方法是为 Mysubscrib 提供一个额外的工厂方法,该方法接受 Action1 作为参数:

abstract class Mysubscrib<T> extends Subscriber<T> {
    public static <T> Mysubscrib<T> create(final Action1<? super T> action) {
        return new Mysubscrib<T>() {
            @Override
            public onNext(final T value) {
                action.call(value);
            }
        }
    }

    @Override
    public void onCompleted() {
        //do nothing
    }

    @Override
    public void onError(Throwable e) {
        Toast.makeText (ctx,"network error",Toast.LENGTH_SHORT).show ();
    }
}

用法:

userApi.getUserInfoByUid (AuthUtils.getUid (ctx), AuthUtils.getToken (ctx))
        .doOnNext (u -> saveToCache (u))
        .observeOn (AndroidSchedulers.mainThread ())
        .subscribe (Mysubscrib.create(u -> {
            if (updateListener != null)
                updateListener.onUpdate (u);
        });