假設有一個可觀察對象,它生成非常大(10,000+個元素)集合的序列。這個observable在後臺線程上工作,然後將結果傳遞給UI線程,RecyclerView適配器在其中添加每個字符串。 一般來說,有兩種方法,其中分割每個列表上單獨字符串:Android,RX:UI線程是什麼 - 集合或元素?
- 在觀察的本身(發射不集合,但字符串),在工作線程。
- 在訂閱服務器上,在UI線程上。
在第一種情況下,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); });
方法2,處理數據:在後臺線程
方法1,處理數據
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); });
我不確定這兩種不同的方法是什麼樣子。你可以添加一些代碼嗎?我通常只是讓我的訂閱服務器在列表
添加了代碼例如。 – Alexey