2016-07-13 5 views
1

私はRxJavaを使って1時間の経験があり、インターフェースとリスナーを使う代わりにプロジェクトに実装しようとしています。RxJavaとAsyncTaskとActivity with android

別のモジュールでGoogleクラウドのエンドポイントメソッドを呼び出す非同期タスクがあり、完了したらList<Profile>を受信します。

非同期タスクのonPostExecute()メソッドでは、すべてのサブスクライバがこのデータを受け取るようにonNextを呼び出します。私はその後、onNext()メソッドを呼び出して非同期タスクからこのデータを収集したい私のフラグメントで

private BirthpayApi mApi; 
private String mUserId; 
private ReplaySubject<List<Profile>> notifier = ReplaySubject.create(); 

public GetFriends(String userId) { 
    mUserId = userId; 
} 

public Observable<List<Profile>> asObservable() { 
    return notifier; 
} 

@Override 
protected List<Profile> doInBackground(Void... params) { 
    if (mApi == null) { 
     BirthpayApi.Builder builder = new BirthpayApi.Builder(AndroidHttp.newCompatibleTransport(), 
        new AndroidJsonFactory(), null) 
        // options for running against local devappserver 
        // - 10.0.2.2 is localhost's IP address in Android emulator 
        // - turn off compression when running against local devappserver 
        .setRootUrl("http://10.0.2.2:8080/_ah/api/") 
        .setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { 
        @Override 
        public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException { 
          abstractGoogleClientRequest.setDisableGZipContent(true); 
         } 
        }); 
      mApi = builder.build(); 
    } 

    try { 
     return mApi.getFriends(mUserId).execute().getItems(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

@Override 
protected void onPostExecute(List<Profile> friends) { 
    super.onPostExecute(friends); 
    notifier.onNext(friends); 
} 

:ここ

は次のようにAsyncTaskが見えるものです。私はしたがって、フラグメントを拡張するクラスを宣言するときにimplements Action1<List<Profile>>を使用します。

私は非同期タスクから送信されたデータを収集するアクション1インターフェースから来 onCall()方法で

:私はツリーハウスと一緒に次のですが、それらが観測可能となった彼らのデータをモデル化するためにオブジェクトを使用

@Override 
public void call(List<Profile> profiles) { 
    if (profiles.size() > 0) { 
     updateAdapter(profiles); 
    } else 
     setUpNoFriendsViews(); 
} 

非同期クラスを使用する代わりに、オブザーバとしてアダプタを使用します。私はこれを間違ってやっているのですが、どうすればそれを動かすことができますか?

+0

をので、あなたがあなたの電話をかけるときに観察できるが、更新されたプロファイルのリストを発するようにしたいですか? –

+0

@Will Evers –

+0

次に、あなたのリストを変更するイベントを監視するobservableが必要で、関数内のapiを呼び出して更新リストにマップします。 これを非同期で行うには、RXbindingsライブラリを使用する必要があります。または、非同期呼び出しを継続して使用してください。 –

答えて

5

どこにでも作成しているObservableを購読しているようではなく、AsyncTaskでexecuteをどこで呼び出すのかは不明です。また、私はしませんあなたはReplaySubjectがほしいと思うが、それはあなたが達成しようとしているものに依存します。

私は、RxとAsyncTasksを混ぜるのではなく、Rxに完全に切り替えることをお勧めします。あなたのフラグメントに続いて

public Observable<List<Profile>> getProfiles() { 

    return Observable.defer(new Func0<Observable<List<Profile>>>() { 
     @Override 
     public Observable<List<Profile>> call() { 

      if (mApi == null) { 
       BirthpayApi.Builder builder = new BirthpayApi.Builder(AndroidHttp.newCompatibleTransport(), 
         new AndroidJsonFactory(), null) 
         // options for running against local devappserver 
         // - 10.0.2.2 is localhost's IP address in Android emulator 
         // - turn off compression when running against local devappserver 
         .setRootUrl("http://10.0.2.2:8080/_ah/api/") 
         .setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { 
          @Override 
          public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException { 
           abstractGoogleClientRequest.setDisableGZipContent(true); 
          } 
         }); 
       mApi = builder.build(); 
      } 

      try { 
       List<Profile> profiles = mApi.getFriends(mUserId).execute().getItems(); 
       return Observable.just(profiles); 
      } catch (IOException e) { 
       return Observable.error(e); 
      } 
     } 
    }); 
} 

:この場合、あなたのモデルクラスのようなメソッドの何かを作る

modal.getProfiles() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(
     new Action1<List<Profile>>() { 
       //... 
     }, 
     new Action1<Throwable>() { 
      @Override 
      public void call(Throwable throwable) { 
       throwable.printStackTrace(); 
      } 
     } 
    ); 
+0

しかし、これはお勧めの方法ではありません。では、推奨される方法はどのように見えますか? Btwは答えに感謝します。 @ Jahnold –

+0

「お勧めの方法」と言うとき、Treehouseはお勧めしますか? AsyncTaskでSubjectを使用する方法を表示する場合は、答えを拡大できますが、私はそれをお勧めしません! – Jahnold

+0

あなたがやる方法。 @Jahnold –