Fernando Ceja のクリーン アーキテクチャを使用して Android アプリを開発しています。私のインタラクターまたはユース ケースの 1 つが、ユーザーのフィード データの取得を担当しています。データを取得するには、まずデータベース テーブルからユーザーのチームを取得し、次にサーバー側からフィード リストを取得する必要があります。
これは、データベース レイヤーからチームを取得する方法です。
mTeamCache.getAllTeams().subscribe(new DefaultSubscriber<List<SimpleTeam>>() {
@Override
public void onNext(List<SimpleTeam> simpleTeams) {
super.onNext(simpleTeams);
mTeams = simpleTeams;
}
});
TeamCache は基本的に、データベースにあるすべてのチームを取得する別の Interactor です。
サーバー側からフィード データを取得する方法は次のとおりです。
mFeedRepository.getFeed(0, 50).subscribe(new ServerSubscriber<List<ApiFeedResponse>>() {
@Override
protected void onServerSideError(Throwable errorResponse) {
callback.onFeedFetchFailed(...);
}
@Override
protected void onSuccess(List<ApiFeedResponse> responseBody) {
//Do stuff with mTeams
callback.onFeedFetched(...);
}
});
私の GetFeedInteractor クラスには execute と呼ばれるメソッドがあり、後で応答を処理するために UI で使用する Callback を渡します。これらすべての問題は、現在、次のように応答を連鎖させていることです。
@Override
public void execute(final Callback callback, String userSipId) {
mTeamCache.getAllTeams().subscribe(new DefaultSubscriber<List<SimpleTeam>>() {
@Override
public void onNext(List<SimpleTeam> simpleTeams) {
super.onNext(simpleTeams);
mTeams = simpleTeams;
getFeedFromRepository(callback);
}
});
}
public void getFeedFromRepository(final Callback callback) {
mFeedRepository.getFeedRx(0, 50).subscribe(new ServerSubscriber<List<ApiFeedResponse>>() {
@Override
protected void onServerSideError(Throwable errorResponse) {
callback.onFeedFetchFailed("failed");
}
@Override
protected void onSuccess(List<ApiFeedResponse> responseBody) {
//Do stuff with mTeams
List<BaseFeedItem> responseList = new ArrayList();
for (ApiFeedResponse apiFeedResponse : responseBody) {
responseList.add(FeedDataMapper.transform(apiFeedResponse));
}
callback.onFeedFetched(responseList);
}
});
}
ご覧のとおり、Cache Interactor から Team コレクションを取得したら、まったく同じ Subscriber からフィードを取得するメソッドを呼び出します。私はこれが好きではありません。Observable.concat(getTeamsFromCache(), getFeedFromRepository()); を使用するなど、より良いことができるようにしたいと考えています。サブスクライバー内の別の rx.Observable への呼び出しをチェーンすることは、良いことではありません。私の質問は、異なるサブスクライバーを使用している 2 つの rx.Observables をチェーンするにはどうすればよいですか?
アップデート:
ServerSubscriber は、Retrofit サービスにサブスクライブするために実装したサブスクライバーです。エラーコードなどをチェックするだけです。ここは:
https://gist.github.com/4gus71n/65dc94de4ca01fb221a079b68c0570b5
デフォルト サブスクライバは、空のデフォルト サブスクライバです。ここは:
https://gist.github.com/4gus71n/df501928fc5d24c2c6ed7740a6520330
TeamCache#getAllTeams() は rx.Observable を返します> FeedRepository#getFeed(int page, int offset) は rx.Observable を返します>
更新 2:
ユーザーのフィードを取得するインタラクターは次のようになります。
@Override
public void execute(final Callback callback, int offset, int pageSize) {
User user = mGetLoggedUser.get();
String userSipid = mUserSipid.get();
mFeedRepository.getFeed(offset, pageSize) //Get items from the server-side
.onErrorResumeNext(mFeedCache.getFeed(userSipid)) //If something goes wrong take it from cache
.mergeWith(mPendingPostCache.getAllPendingPostsAsFeedItems(user)) //Merge the response with the pending posts
.subscribe(new DefaultSubscriber<List<BaseFeedItem>>() {
@Override
public void onNext(List<BaseFeedItem> baseFeedItems) {
callback.onFeedFetched(baseFeedItems);
}
@Override
public void onError(Throwable e) {
if (e instanceof ServerSideException) {
//Handle the http error
} else if (e instanceof DBException) {
//Handle the database cache error
} else {
//Handle generic error
}
}
});
}