Rxjava静态通用实用方法,带变压器

时间:2016-02-06 17:02:18

标签: android rx-java

最近,我看到RxJava article解释了Transformers,并重点介绍了如何将其用于重用Schedulers。我尝试使用它并在同一个类中,这个方法工作正常:

<T>Observable.Transformer<T, T> applySchedulers() {
        return new Observable.Transformer<T, T>() {
            @Override
            public Observable<T> call(Observable<T> observable) {
                return observable
                        .subscribeOn(Schedulers.io())
                        .unsubscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread());
            }
        };
    }

我想用静态方法将它移动到一个帮助器类中,这样我就可以在我的整个Android应用程序中使用它。但是当我尝试使用这个类的方法时

public class RxFunctions {

    public static <T>Observable.Transformer<T, T> applySchedulers() {
        return new Observable.Transformer<T, T>() {
            @Override
            public Observable<T> call(Observable<T> observable) {
                return observable
                        .subscribeOn(Schedulers.io())
                        .unsubscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread());
            }
        };
    }
}

在另一个班级里面

public void requestLoginState() {
        restClient.requestLoginState()
                .compose(RxFunctions.applySchedulers())
                .subscribe(new TimberErrorSubscriber<LoginStateResponse>() {
                    @Override
                    public void onCompleted() {
                    }
                    ...

它将不再识别我的Subscriber,错误:Cannot resolve method 'subscribe(anonymous com.example.util.rx.TimberErrorSubscriber<com.example.network.retrofit.response.login.LoginStateResponse>)'

我在没有Java8的情况下使用Retrolambda。 将撰写行更改为

.compose(this.<LoginStateResponse> RxFunctions.applySchedulers())

导致LoginState类型出现Reference parameters are not allowed here

错误

我对RxJava相当新,并对任何建议表示感谢。

1 个答案:

答案 0 :(得分:6)

编辑:现在Android执行support java 8

你说你在android上使用Java8,但android不支持Java8而没有像retrolambda这样的插件,所以我假设你实际上是用Java6编译的(因为Java7只适用于KitKat及以上版本)。

在这种情况下,您可能需要明确applySchedulers的参数类型。我相信你在编写this.<LoginStateResponse>时尝试这样做,但只有当你的泛型方法在你当前的类中时才会这样做。

在您的情况下,您实际需要的是在静态方法调用上指定类型:

.compose(RxFunctions.<LoginStateResponse>applySchedulers())