gpt4 book ai didi

android - 在 onDoNext 和 doOnCompleted 方法中难以设置 View

转载 作者:行者123 更新时间:2023-11-29 16:55:25 24 4
gpt4 key购买 nike

我正在学习 RxAndroid,并从我项目中的一个非常简单的示例开始。即获取可观察的用户个人资料图片 URL 响应。

下面是获取字符串 URL 值的代码,我使用 Picasso 加载图像 URL。当我使用 runonUiThread 加载图像时代码工作正常,但是当我不使用它时它会抛出错误;它说方法调用应该在主线程中。

doOnNext 和 doOnCompleted 是否总是在后台线程上运行?

picUrlSubscription = getUrlAsObservable()
.map(responseBodyResponse -> {
Log.d(TAG, "map ");
try {
if (responseBodyResponse.isSuccessful()) {
observableStr = responseBodyResponse.body().string();
return observableStr;
} else {
observableStr = "Bad_url";
return observableStr;
}

} catch (IOException e) {
e.printStackTrace();
}
return null;
})
.doOnNext(s -> {
Log.d(TAG, "next ");
try {
if (s != null && !s.equalsIgnoreCase("Bad_url")) {
observableStr = new JSONObject(s).getString("url");

} else
runOnUiThread(() -> profileCircle.setImageResource(R.drawable.profil));

} catch (JSONException e) {
e.printStackTrace();
runOnUiThread(() -> profileCircle.setImageResource(R.drawable.profil));
}
})
.doOnCompleted(() -> {
Log.d(TAG, "completed ");
runOnUiThread(() -> Picasso.with(this).load(observableStr).into(profileCircle));
})
.onErrorReturn(throwable -> {
Log.d(TAG, "error "+ throwable.getMessage());
observableStr = "bad_url";
runOnUiThread(() -> profileCircle.setImageResource(R.drawable.profil));
return observableStr;
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe();

最佳答案

不,doOnNext()doOnCompleted() 在指定的线程上运行以通知其观察者。如果未指定线程,它们将在运行 observable 的同一线程上运行。

由于您指定了 subscribeOn(Schedulers.io()),因此可观察对象将在 io 线程上运行。根据documentation ; subscribeOn() 运算符指定可观察对象将在哪个线程上运行,无论它出现在链中的哪个位置,这与 observeOn() 运算符不同:

ObserveOn, on the other hand, affects the thread that the Observable will use below where that operator appears.

因此,将您的observeOn() 调用放在您的doOnNext()doOnCompleted() 调用之前。

关于android - 在 onDoNext 和 doOnCompleted 方法中难以设置 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45224336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com