2014-10-19 82 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);