2015-06-07 25 views
3

我的問題是什麼是一個適配器訂閱多個觀測適配器訂閱多個觀測量

最好的方式,我有一個有頭和經常項目類型的適配器。適配器的信息使用Sqlbrite從數據庫提供。使用Sqlbrite,我想通過讓適配器訂閱observable來更新頭和列表。

第一個Observable不是問題。在我的片段的的onResume:

mSubscription = TrackerDbUtils.getListSubmissionObservable(db) 
      .map(Submission.MAP) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(mAdapter); 

不過,我再嘗試第二個可觀測添加到片段

mHeaderSubscription = TrackerDbUtils.getSummaryObservable(db) 
      .map(Summary.MAP) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(mAdapter); 

所以,我需要在我的適配器來實現措施1:

public class MileageTrackerAdapter extends HeaderRecyclerViewAdapter 
    implements Action1<List<Submission>>, Action1<Summary> { 
    . 
    . 
    . 

} 

但是,我得到重複的類錯誤。所以我試圖實現一個通用類型:

public class MileageTrackerAdapter extends HeaderRecyclerViewAdapter 
    implements Action1<Object> { 
    . 
    . 
    . 
    @Override 
    public void call(Object o) { 
     if(o instanceof Summary){ 
       // Logic 
     } else { 
       // Logic 
     } 
    } 
} 

但我得到一個運行時錯誤,我無法將摘要映射到提交。即使那樣,我也不確定鑄造通用型是否是解決問題的最佳方法。

基於從dwursteisen反饋:

我改變了我的總結類映射到提交。我還創建了一個名爲「isSummary」的新字段。按照建議將我的觀察值更改爲以下值:

TrackerDbUtils.getListSubmissionObservable(db) 
    .map(Submission.MAP) 
    .mergeWith(TrackerDbUtils.getSummaryObservable(db) 
           .map(Summary.MAP)) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(mAdapter); 

這會創建一個可啓動兩次的Observable;一次是提交的大量列表,另一個是大小爲1的列表。該列表實際上是摘要。在我的適配器:

@Override 
public void call(List<Submission> mSubmissions) { 

    if(mSubmissions.size() == 1 && mSubmissions.get(0).isSummary()){ 
     mSummary = mSubmissions.get(0); 
    } else { 
     mArray = new ArrayList<>(mSubmissions); 
    } 

    notifyDataSetChanged(); 

} 

回答

2

您應該避免使用相同的適配器兩個不同的數據流,因爲它必須處理併發的問題,你能避免使用RxJava。

爲什麼不試試你的流合併成一個單一的一個,並且,然後,只用一個適配器?

TrackerDbUtils.getListSubmissionObservable(db) 
     .map(Submission.MAP) 
     .mergeWith(TrackerDbUtils.getSummaryObservable(db) 
            .map(Summary.MAP)) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(mAdapter); 

您可能需要使用對象映射List<Submission>Summary同一個常見的類型,或處理到您的適配器

+0

你能否併發問題詳細點嗎?我是RxJava的新手,所以我的印象是訂閱多個可觀察對象是RxJava的一大特點。這不是這種情況嗎? – Tykin

+0

您的訂閱者/觀察者的onNext方法可能在同一時間被調用,因爲共享相同訂閱者/觀察者的每個observable可能會在不同的線程上下文中觀察。 – dwursteisen

1

也許有人會給出更好的答案,但在這樣的情況下,我通常創建這些接口的公衆最終匿名實例。因此,代碼看起來是這樣的:

public class Adapter extends HeaderRecyclerViewAdapter { 

    public final Action1<Summary> summary = new Action1<Summary> { ... } 
    public final Action1<List<Submission>> submissions = new Action1<List<Submission>> { ... } 

} 

這樣一來,既措施1實現內部的方法可以在適配器類訪問的一切,好像他們是正常的方法,我可以在它們之間在同一時間使用mAdapter區分。總結或mAdapter.submissions