2014-10-19 4 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 - это простой боб, реализующий Observer еще раз, но есть часть, которую я не понимаю: #bindFragment Method проверяет экземпляры фрагмента. Поскольку WriteObserver не является фрагментом, я вызываю исключение. Но я не могу зарегистрировать второго наблюдателя из-за Generics.

Я уверен, что знаю меньше о RX, любой может указать мне в правильном направлении, чтобы решить эту проблему?

[Update 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

ответ

0

Как я понимаю, mLoader#getReadSubscription() и mLoader#createWriteSubscription() создают пары и подписываются на него.

Я не думаю, что правильный способ сделать это, как если бы mLoader подписался на потоки, он должен решить, как отписаться от него тоже.

Как вы хотите использовать AndroidObservable.bindFragment, mLoader#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); 
Смежные вопросы