【问题标题】:RxJava Android: Observer incompatible types errorRxJava Android:观察者不兼容类型错误
【发布时间】:2020-03-15 15:03:02
【问题描述】:

我想使用 RxJava 和 RxAndroid 进行以下异步网络调用。我在项目依赖项中包含了最新的RxJava (3.0.1) 和RxAndroid (3.0.0),但在Subscription subscription = .... 块中仍然出现以下错误:

不兼容的类型

必需:org.reactivestreams.Subscription

找到:无效

这是为什么呢?谁能告诉我如何让这个 RxJava observable 工作?

感谢任何帮助。

Subscription subscription = getServerResponse(et_id.getText().toString())// error highlighted in this whole block
       .subscribeOn(Schedulers.io())
       .observeOn(AndroidSchedulers.mainThread())
       .subscribe(new Observer<String>() { 
            @Override
            public void onSubscribe(@NonNull Disposable d) {
            }

            @Override
            public void onNext(String bitmap) {
               // Handle result of network request
            }

            @Override
            public void onError(@NonNull Throwable e) {
               // Update user interface to handle error
            }

            @Override
            public void onComplete() {
               // Update user interface if needed
            }
       });

public Observable<String> getServerResponse(String string) {
    return Observable.fromCallable(new Callable<String>() {
        @Override
        public String call() throws Exception {
            BufferedReader inFromServer = null;
            String response = "";
            Socket clientSocket = null;
            try {
                clientSocket = new Socket(serverHostname, serverPort);
                DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
                inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                outToServer.writeBytes(string + "\n");
                response = inFromServer.readLine();
                clientSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
                response = MainActivity.this.getString(R.string.result_serverError);
            }
            return response;
        }
    });
}

我对反应式 Java 的所有导入:

import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;

【问题讨论】:

  • 检查你的导入,也许你使用了错误的 observable。
  • 我使用import io.reactivex.rxjava3.core.Observable;。这样不行吗?
  • 这对你有用吗?你是从 1.x 迁移过来的吗?请阅读this 部分。

标签: java android observable rx-java rx-android


【解决方案1】:

尝试使用一次性复合材料。应该是这样的:

private CompositeDisposable compositeDisposable = CompositeDisposable();
compositeDisposable.add(getServerResponse(et_id.getText().toString())
   .subscribeOn(Schedulers.io())
   .observeOn(AndroidSchedulers.mainThread())
   .subscribe(new Observer<String>() { 
        @Override
        public void onSubscribe(@NonNull Disposable d) {
        }

        @Override
        public void onNext(String bitmap) {
           // Handle result of network request
        }

        @Override
        public void onError(@NonNull Throwable e) {
           // Update user interface to handle error
        }

        @Override
        public void onComplete() {
           // Update user interface if needed
        }
   }));

不要忘记在活动的 onDestroy 方法上执行 CompositeDisposable.dispose()。

让我知道它是否适合你!

【讨论】:

  • 不,这不起作用,似乎我错过了使用它的一些依赖项。这不是来自 RxJava2 吗?我使用v3。它想将onSubscribe 重命名为MainActivity 以及各种其他的东西。我想要的基本上是通过套接字对服务器进行异步调用,并使用 observable 更新 UI。
  • 好吧,设法解决了这个问题。我选择使用Disposeable,解决了这个问题。无论如何谢谢:-)
猜你喜欢
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
相关资源
最近更新 更多