2014-10-19 115 views
0

想象一下,您需要加載一些數據並將其保存到您的碎片中。RX Java多訂閱

我想使用RX Java。你如何處理一個片段上的多個訂閱? AndroidObservable.bindFragment完成作業。但是當我需要更多訂閱時,我該如何使用它?

public class MyFragment extends SomeFragment implements Observer<List<Item>> 
{ 

private Subscription mReadSubscription; 

private Subscription mWriteSubscription; 

private JSONLoader mLoader; 

@Override 
public void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
    final File theFile = new File(getActivity().getFilesDir(), FILE_NAME); 
    mLoader = new JSONLoader(theFile); 
    mReadSubscription = mLoader.getReadSubscription(this); 
    mWriteSubscription = mLoader.createWriteSubscription(new WriteObserver(), Collections.EMPTY_LIST); 

這背後的想法是保存和使用Loader.load方法()loader.save()負載項目,每個項目的這將導致觀察者正在使用(mReadSubscription,mWriteSubscription)。

WriteObserver只是一個簡單的Bean再次實現觀察器,但有部分我不明白:#bindFragment方法檢查Fragment的實例。由於WriteObserver不是我導致異常的片段。 但我不能註冊第二觀察員,因爲泛型

林肯定我很確定我知道更少關於RX,任何人都可以指向我在一個正確的方向來解決這個問題?

[更新1]

還有就是我WriteObserver:

private final class WriteObserver implements Observer<Void> { 


    @Override 
    public void onCompleted() { 

     Toast.makeText(getActivity(), "Save Successful", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onError(Throwable e) { 

    } 

    @Override 
    public void onNext(Void aVoid) { 
    } 
} 

設計是無法正常運轉的WriteObserver不是一個片段,因爲當你做一個例外:

java.lang.IllegalArgumentException: Target fragment is neither a native nor support library Fragment 



AndroidObservable.bindFragment(observer, source) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(observer); 

那麼,我該如何解決這個限制?

+0

我更新了更新後我的反應。 – dwursteisen 2014-10-20 10:12:28

回答

0

據我所知,mLoader#getReadSubscription()mLoader#createWriteSubscription()創建蒸汽並訂閱它。

我不認爲正確的做法,就好像mLoader訂閱流,它應該處理如何取消訂閱它。

當你想使用AndroidObservable.bindFragmentmLoader#getReadSubscription()mLoader#createWriteSubscription()應該返回Observable而不是Subscription

所以,在你的片段,你就可以這樣寫:

@Override 
public void onCreate(final Bundle savedInstanceState) { 
    // [...] 
    Observable<?> readObs = mLoader.getReadSubscription(); 
    mReadSubscription = AndroidObservable.bindFragment(this, readObs).subscribe(this); 

    Observable<?> writeObs = mLoader.createWriteSubscription(Collections.emptyList()); 
    mWriteSubscription = AndroidObservable.bindFragment(this, writeObs).subscribe(new WriteObserver()); 
} 

那麼,如何才能解決這一限制?

這不是限制。

public static <T> Observable<T> bindFragment(Object fragment, Observable<T> source) { 
     // ... 
} 

第一個參數應該是你的片段,而不是你的觀察。這就是爲什麼你應該寫你的代碼爲:

yourSubscription = AndroidObservable.bindFragment(yourFraglebt, yourObservable).subscribe(yourObserver); 

所以你的情況:

AndroidObservable.bindFragment(this, source) // as bindFragment observeOn mainThread, you can remove the observeOn method call 
     .subscribeOn(Schedulers.io()) 
     .subscribe(observer); 

,而不是

AndroidObservable.bindFragment(observer, source) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(observer);