私は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>>
を使用します。
onCall()
方法で
:私はツリーハウスと一緒に次のですが、それらが観測可能となった彼らのデータをモデル化するためにオブジェクトを使用
@Override
public void call(List<Profile> profiles) {
if (profiles.size() > 0) {
updateAdapter(profiles);
} else
setUpNoFriendsViews();
}
非同期クラスを使用する代わりに、オブザーバとしてアダプタを使用します。私はこれを間違ってやっているのですが、どうすればそれを動かすことができますか?
をので、あなたがあなたの電話をかけるときに観察できるが、更新されたプロファイルのリストを発するようにしたいですか? –
@Will Evers –
次に、あなたのリストを変更するイベントを監視するobservableが必要で、関数内のapiを呼び出して更新リストにマップします。 これを非同期で行うには、RXbindingsライブラリを使用する必要があります。または、非同期呼び出しを継続して使用してください。 –