2016-08-16 43 views
1

假設有一個可觀察對象,它生成非常大(10,000+個元素)集合的序列。這個observable在後臺線程上工作,然後將結果傳遞給UI線程,RecyclerView適配器在其中添加每個字符串。 一般來說,有兩種方法,其中分割每個列表上單獨字符串:Android,RX:UI線程是什麼 - 集合或元素?

  1. 在觀察的本身(發射不集合,但字符串),在工作線程。
  2. 在訂閱服務器上,在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); });

+0

我不確定這兩種不同的方法是什麼樣子。你可以添加一些代碼嗎?我通常只是讓我的訂閱服務器在列表中調用adapter.swapItems(list),它通知數據集已更改並重新填充recyclerview,這是我相信您的選項2所做的。 我不確定你想要什麼選項1. – AdamMc331

+0

添加了代碼例如。 – Alexey

回答

0

只是測試,並決定什麼實際工作更好你(像往常一樣,當我們講演時)。我建議你不要限制自己的兩個變種。考慮傳遞給10-100個字符串的適配器塊的中間變體。

2

恕我直言,我會採取第三種方法。

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

緩衝的原因是您添加的物品速度太快會使recyclerView失敗。 緩衝區的時間,或使用更簡單的緩衝區(nItems),它是要調整的東西。