如何使用 Rx Java 更新链请求上的 UI

Tee*_*i.P 2 java rx-java retrofit rx-android

我想根据链请求更新 UI 2 次。

请求getUserByID()完成后首先更新 UI 。第二次getParentName()完成但是当我尝试在第一个请求时更新 UI 并获得线程问题的错误原因时。

我不知道如何解决这个问题。

示例代码

API.getUserByID("USER ID")
        .flatMap(user-> {
            // How to update UI here?
            return API.getParentName(user.getId()))
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(parent-> {
            // It's ok to update UI cause of on main thread.
            parentTextView.setText(parent.getName())
        });
Run Code Online (Sandbox Code Playgroud)

谢谢你。

zel*_*lla 5

您希望在可观察的发射上更新 UI,因此您需要为该可观察的指定观察者线程。
然后你应该使用doOnNext在观察者线程上调用的运算符:

API.getUserByID("USER ID")
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .doOnNext(user_ -> {calls on observer thread})
        .flatMap(user-> {
            return API.getParentName(user.getId()))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
        })
        .subscribe(parent-> {
            // It's ok to update UI cause of on main thread.
            parentTextView.setText(parent.getName())
        });
Run Code Online (Sandbox Code Playgroud)

  • 您的意思是“NetworkOnMainThreadException”吗?尝试将 .`subscribeOn(Schedulers.io()` 应用于每个可观察的网络,而不是 `flatmap`,我更新了答案 (2认同)