gpt4 book ai didi

android - 尽管有 RxJava,但 Android 中仍发生 UI 阻塞

转载 作者:太空狗 更新时间:2023-10-29 16:37:06 25 4
gpt4 key购买 nike

我正在使用 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 使用它的同一个类中的实例变量,但端点调用是从一个单独的库执行的,这可能是一个问题吗?应该没关系吧?

我是否做了不该做的坏事?

--

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

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 并传递的值(value)发生在另一个线程上,但这对你没有太大帮助......

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

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