2015-05-21 3 views
1

Я пытаюсь реализовать Observer/Subscriber с RxJava в первый раз. я получаю ошибку компиляции:Фрагмент подписаться на Observer

cannot resolve method subscribe(android.support.v4.app.Fragment) 

на линии, указанной ниже. Поэтому я не подписываюсь правильно. Как это сделать?

public class MainActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     Fragment myFragment = mTabsPageAdapter.getItem(2); 

     Observable<String> loadAndStoreDataObservable = Observable.create(
       new Observable.OnSubscribe<String>() { 
        @Override 
        public void call(Subscriber<? super String> subscriber) { 
         try {   
          <get data from RESTful service> 
          <write data to SQLite db on device> 

          subscriber.onNext("Done"); 
          subscriber.onCompleted(); 
         } 
         catch (Exception e) { 
          subscriber.onError(e); 
         } 
        } 
       } 
     ) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(myFragment); // cannot resolve method subscribe(android.support.v4.app.Fragment) 
    } 
} 

import android.support.v4.app.Fragment; 
public class MyFragment extends Fragment implements Observer<String> { 

     @Override       
     public void onNext(String s) {  
      System.out.println(s);   
     }         

     @Override       
     public void onCompleted() {  
     }         

     @Override       
     public void onError(Throwable e) { 
     } 
}  

Редактировать: Я изменил линию, предложенную Владимиром Мироновым. Это кажется необходимым, но недостаточно. Реализация его я тогда получаю ошибку компиляции на линии после этого:
Несовместимые типы: Обязательный rx.Observable Найдено rx.Subscription

Это предполагает приведение к (Observable<String>) так:

Observable<String> loadAndStoreDataObservable = (Observable<String>) Observable.create(...) 

который действительно делает компиляцию без ошибок, но дает ошибку времени выполнения:
java.lang.ClassCastException: rx.observers.SafeSubscriber нельзя отличить до rx.Observable

Edit 2: Я думаю, что это должно быть: Subscription loadAndStoreDataObservable = ...

+2

MyFragment myFragment = (MyFragment) mTabsPageAdapter.getItem (2); –

+0

Спасибо за ответ. См. Редактирование исходного вопроса. –

+1

Тип возврата из 'subscribe' является подпиской, а не наблюдаемой. – njzk2

ответ

3

Никто не делая шаг вперед, поэтому я агрегировать комментарии в ответ.

  1. В ролях на MyFragment:

    MyFragment myFragment = (MyFragment) mTabsPageAdapter.getItem(2); 
    
  2. Изменение loadAndStoreDataObservable быть Subscription

    Subscription loadAndStoreDataObservable = ... 
    
  3. В OnDestroy(), отписать:

    protected void onDestroy() { 
        super.onDestroy(); 
        if (loadAndStoreDataObservable != null) { 
         loadAndStoreDataObservable.unsubscribe(); 
        } 
    }