英文:
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<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
}
}));
Dont forget to do a compositeDisposable.dispose() on the onDestroy method of your activity.
Let me know if it works for you!
专注分享java语言的经验与见解,让所有开发者获益!
评论