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

Eve*_*Eve 2 android rx-java

最近我看到一篇RxJava文章解释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());
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

我想用静态方法将它移动到一个帮助器类中,这样我就可以在我的整个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());
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

在另一个班级里面

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

它将不再识别我的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())
Run Code Online (Sandbox Code Playgroud)

导致LoginState类型的错误说明 Reference parameters are not allowed here

我很新,RxJava对任何建议都很感激.

Log*_*ain 6

编辑:现在Android确实支持java 8

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

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

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

.compose(RxFunctions.<LoginStateResponse>applySchedulers())
Run Code Online (Sandbox Code Playgroud)