android - 尽管有 RxJava,Android 中还是会出现 UI 阻塞

标签 android rx-java

我正在使用 RxJava 将网络访问移至 Android 中的单独线程,但我的 UI 仍然阻塞。

我没有使用错误的可观察值,如下所示:Android RxJava, Non Blocking?

下面代码中的代码点 [A]、[B] 和 [C] 按 [A] -> [C] -> [B] 的顺序传递,因此当前线程处理良好并且 RxJava 调用 [C]一旦有了结果。这很好。

此外,与在 UI 线程上进行网络调用相比,阻塞要好得多,但我仍然有轻微的阻塞。调用后 UI 保持流畅,但如果服务器在几毫秒内没有响应,则会阻塞。

    private search; // search is an instance variable in the same class

    // [A]

    Observable.just(search.find("something")) // search.find calls the REST endpoint
            .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Search>() {

                @Override public void call(Search search) {
                    // further processing // [B]
                }

            }, new Action1<Throwable>() {

                @Override public void call(Throwable throwable) {
                    // error handler
                }

            });

    // [C]

search 是 Observable 使用它的同一个类中的实例变量,但端点调用是从单独的库执行的,这可能是一个问题吗?应该没什么关系吧?

我是不是做了什么不该做的坏事?

--

Find 看起来像这样(为了简洁删除了异常处理):

public Search find(String searchtext) {
    setSearchtext(searchtext);
    SearchEndpoint.find(Session.getUser().getId(), searchtext);
    return this;
}

像这样的搜索端点:

public static Search find(final Long userId, final String searchtext) throws IOException {
    return ApiService.api().searches().find(userId).setFind(searchtext).execute();
}

并调用生成的 Google 云端点库。

最佳答案

试试这个:

Observable.create(new Observable.OnSubscribe<Search>() {

    @Override
    // method signature is from memory - I hope I am correct...
    public void call(Subscriber<? super Search> subscriber) {
        try {
            Search search = search.find("something");
            subscriber.onNext(search);
            subscriber.onCompleted();
        } catch (SomeException e) {
            subscriber.onError(e);
        }
    }
})
// and then continue with your .subscribeOn(...)

澄清一下,也许这会使您的代码问题更加明显:

Observable.just(search.find("something"))

显然等同于

Search search = search.find("something");
Observable.just(search)

这很明显,search.find 是在我们将控制权交给 rxjava 之前执行的,并且它在您当前所在的任何线程上执行 - 然后根据预先计算的值和交付构造一个 Observable该值发生在另一个线程上,但这对您没有多大帮助......

关于android - 尽管有 RxJava,Android 中还是会出现 UI 阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25853696/

相关文章:

java - 对 Verticle 部署进行单元测试

android - 如何将数组传递给另一个 Activity ?

android - 将用户输入保存到 SharedPreferences 并将值设置为 EdiTtext

java - 如何在订阅开始时显示对话框?

java - 在提供给 flatMap 的 RxJava Func1 对象中使用可变状态是个好主意吗?

android - RxJava onBackpressureBuffer 不发射项目

android - 在 Android Studio (cmake) 中使用预构建的共享库

java - Android Studio com.google.wireless.android.sdk.stats.IntellijIndexingStats

java - 如何在 Android 中解析复杂的 json 响应

android - 如何管理并行和串行 Retrofit API 调用