首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android,RX:什么使UI线程-集合或元素?

Android,RX:什么使UI线程-集合或元素?
EN

Stack Overflow用户
提问于 2016-08-16 18:12:33
回答 2查看 1.1K关注 0票数 1

假设有一个可观测的集合,它生成非常大(10,000+元素)集合的序列。这个可观察到的线程在后台线程上工作,然后将结果传递给UI线程,在UI线程中,RecyclerView适配器添加每个字符串。一般来说,有两种方法,在不同的字符串中拆分每个列表:

  1. 在可观察的自身(不是发出集合,而是发出字符串)上,在工作线程上。
  2. 在订阅服务器上,在UI线程上。

在第一种情况下,UI做了一个小任务。对于应用程序responsiveness来说,这是很重要的,但是由于开销在线程之间传输每个字符串,处理数据的总时间可能也会显著增长,从而降低应用程序的性能。

你怎么想,你更喜欢哪种方法?

示例代码.

方法1,处理后台线程上的数据:

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); });

方法2,在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); });

EN

回答 2

Stack Overflow用户

发布于 2016-08-18 23:26:39

我会采取第三种方法。

代码语言:javascript
复制
stringsObservable.buffer(1, TimeUnit.SECONDS)
  .subscribeOn(Schedulers.newThread)
  .observeOn(AndroidSchedulers.mainThread)
  .subscribe(adapter::addAll)

缓冲的原因是,您添加的项目速度太快,会使recyclerView失败。缓冲区的时间,或者使用更简单的缓冲区(NItems)的时间--这是需要调优的。

票数 2
EN

Stack Overflow用户

发布于 2016-08-16 20:27:51

只需测试并决定什么对你有更好的效果(和往常一样,当我们谈到性能时)。我建议你不要用这两种变体来限制自己。还可以考虑传递给10-100个字符串的适配器块的中间变体。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38981767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档