RxJava Android: 观察者不兼容类型错误

huangapple 未分类评论60阅读模式
英文:

RxJava Android: Observer incompatible types error

问题

以下是已翻译的内容:

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

> 不兼容的类型
>
> 要求:org.reactivestreams.Subscription
>
> 找到:void

为什么会这样?有谁能告诉我如何让这个 RxJava 的可观察对象(observable)工作?

感谢任何帮助。

Subscription subscription = 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) {
               // 处理网络请求的结果
            }

            @Override
            public void onError(@NonNull Throwable e) {
               // 更新用户界面以处理错误
            }

            @Override
            public void onComplete() {
               // 如有必要,更新用户界面
            }
       });

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;
英文:

I have the following Async network call I'd like to make by using RxJava and RxAndroid. I included the latest RxJava (3.0.1) and RxAndroid (3.0.0) in the project dependencies, but still get the following error in the Subscription subscription = .... block:

> Incompatible types
>
> Required: org.reactivestreams.Subscription
>
> Found: void

Why is that? Can anyone tell me how to make this RxJava observable work?

Any help apprechiated, thanks.

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;
        }
    });
}

All my imports for reactive 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;

答案1

得分: 0

尝试使用组合式的可销毁对象。代码示例如下:

private CompositeDisposable compositeDisposable = new 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) {
           // 处理网络请求的结果
        }

        @Override
        public void onError(@NonNull Throwable e) {
           // 更新用户界面以处理错误
        }

        @Override
        public void onComplete() {
           // 如有需要,更新用户界面
        }
   }));

不要忘记在你的活动的 onDestroy 方法中执行 compositeDisposable.dispose()。如果有问题,请告诉我是否有效!

英文:

try using a composite disposable. It would be something like this:

private CompositeDisposable compositeDisposable = CompositeDisposable();
compositeDisposable.add(getServerResponse(et_id.getText().toString())
   .subscribeOn(Schedulers.io())
   .observeOn(AndroidSchedulers.mainThread())
   .subscribe(new Observer&lt;String&gt;() { 
        @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
        }
   }));

Dont forget to do a compositeDisposable.dispose() on the onDestroy method of your activity.

Let me know if it works for you!

huangapple
  • 本文由 发表于 2020年3月15日 23:03:02
  • 转载请务必保留本文链接:https://java.coder-hub.com/60694261.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定