假设有一个可观测的集合,它生成非常大(10,000+元素)集合的序列。这个可观察到的线程在后台线程上工作,然后将结果传递给UI线程,在UI线程中,RecyclerView适配器添加每个字符串。一般来说,有两种方法,在不同的字符串中拆分每个列表:
在第一种情况下,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); });
发布于 2016-08-18 23:26:39
我会采取第三种方法。
stringsObservable.buffer(1, TimeUnit.SECONDS)
.subscribeOn(Schedulers.newThread)
.observeOn(AndroidSchedulers.mainThread)
.subscribe(adapter::addAll)缓冲的原因是,您添加的项目速度太快,会使recyclerView失败。缓冲区的时间,或者使用更简单的缓冲区(NItems)的时间--这是需要调优的。
发布于 2016-08-16 20:27:51
只需测试并决定什么对你有更好的效果(和往常一样,当我们谈到性能时)。我建议你不要用这两种变体来限制自己。还可以考虑传递给10-100个字符串的适配器块的中间变体。
https://stackoverflow.com/questions/38981767
复制相似问题