gpt4 book ai didi

安卓,RX : what put to UI thread - collections or elements?

转载 作者:行者123 更新时间:2023-11-29 19:38:28 25 4
gpt4 key购买 nike

假设有一个可观察对象,它生成非常大(超过 10,000 个元素)集合的序列。这个 observable 在后台线程上工作,然后将结果传递给 UI 线程,RecyclerView 适配器在其中添加每个字符串。通常,有两种方法可以将每个列表拆分为单独的字符串:

  1. 在 observable 自身中(发出的不是集合,而是字符串),在工作线程上。
  2. 在订阅者中,在 UI 线程上。

在第一种情况下,UI 的作用不大。它对应用响应能力很重要但由于在线程之间传输每个字符串的开销,处理数据的总时间也可能显着增加,从而降低应用程序性能。

您怎么看,您更喜欢哪种方法?

示例代码。

方法一,后台线程处理数据:

Observable.create(subscriber -> {
// Data is transferred from background to UI thread 10,000 times.
for (int i = 0; i < 10000; i++)
subscriber.onNext("String " + i);
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.subscribe(data ->
RecyclerView.Adapter adapter = ...;
// UI holds for processing just one string.
adapter.add(data);
});

方法二,在UI线程上处理数据:

Observable.create(subscriber -> {
Collection<String> data = new ArrayList<>();
for (int i = 0; i < 10000; i++) data.add("String " + i);
// Data transfers from background to UI thread only once
subscriber.onNext(data);
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.subscribe(data -> {
RecyclerView.Adapter adapter = ...;
// Long operation, UI waits until all 10,000 element will be processed.
for (String e : data)
adapter.add(e);
});

最佳答案

恕我直言,我将采用第三种方法。

stringsObservable.buffer(1, TimeUnit.SECONDS)
.subscribeOn(Schedulers.newThread)
.observeOn(AndroidSchedulers.mainThread)
.subscribe(adapter::addAll)

缓冲的原因是你添加的项目太快会使 recyclerView 失败。缓冲区的时间,或者使用更简单的缓冲区(nItems),这是需要调整的。

关于安卓,RX : what put to UI thread - collections or elements?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38981767/

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