私は上記のコードでこの
public static <T> Observable<T> callApiWrapper(final Context context,
final boolean shouldShowProgress,
final String message,
final Observable<T> source) {
final ProgressDialog progressDialog = new ProgressDialog(context);
if (shouldShowProgress) {
if (!TextUtils.isEmpty(message))
progressDialog.setMessage(message);
else
progressDialog.setMessage(context.getString(R.string.please_wait));
}
return source.lift(new Observable.Operator<T, T>() {
@Override
public Subscriber<? super T> call(final Subscriber<? super T> child) {
return new Subscriber<T>() {
@Override
public void onStart() {
super.onStart();
if (shouldShowProgress) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
progressDialog.show();
}
});
}
child.onStart();
}
@Override
public void onCompleted() {
if (shouldShowProgress && progressDialog.isShowing())
progressDialog.dismiss();
child.onCompleted();
}
@Override
public void onError(Throwable e) {
if (shouldShowProgress && progressDialog.isShowing())
progressDialog.dismiss();
child.onError(e);
}
@Override
public void onNext(T t) {
/*
Handle Invalid API response
*/
if (((BaseResponse) t).getStatus() == RestParams.Codes.INVALID_API_KEY) {
mCommonDataModel.setApiKey("");
getCommonApiService().getApiKey()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<ResponseBody>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(ResponseBody responseBody) {
try {
String response = responseBody.string();
JSONObject jsonObject = new JSONObject(response);
String key = jsonObject.optString("KEY");
if (!TextUtils.isEmpty(key))
mCommonDataModel.setApiKey(key);
callApiWrapper(context, shouldShowProgress,
message, source)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
} catch (Exception e) {
e.printStackTrace();
}
}
});
} else {
if (shouldShowProgress && progressDialog.isShowing())
progressDialog.dismiss();
child.onNext(t);
}
}
};
}
});
}
のようなラッパーを作成することによって、これを達成し、私は、無効なAPI KEYのような特定のステータスコードを取得する場合、私は新しいAPIキーを取得するためのAPIを呼び出していますことを確認してください元の加入者に直接ステータスを与えるのではなく、
私は成功した新しいAPIキーを取得したら、私は再帰的にラッパーを呼び出す&元加入者への応答を与えることを試みます。しかし、問題は、オリジナル加入者は、私がここで行方不明です何onNext
コールバック
を取得していないのですか?私がやろうとしていることを達成する他の方法はありますか?あなたは、サブスクリプションを開始したときに、それを閉じたときに副作用がすなわちプログレスバーを有効に追加するには
source.flatMap(
t ->
{
if (((BaseResponse) t).getStatus() == RestParams.Codes.INVALID_API_KEY) {
return Observable.error(new InvalidKeyException("The key is not valid"));
}
else {
return Observable.just(t);
}
}
)
.retryWhen(
errors ->
errors.flatMap(error -> {
if (error instanceof InvalidKeyException()) {
return getCommonApiService().getApiKey()
.flatMap(
responseBody -> {
String response = responseBody.string();
JSONObject jsonObject = new JSONObject(response);
String key = jsonObject.optString("KEY");
if (TextUtils.isEmpty(key))
return Observable.error();
else {
return Observable.just(key);
}})
.doOnNext(key -> mCommonDataModel.setApiKey(key));
}
// For anything else, don't retry
return Observable.error(error);
}))
.subscribe(/* do what you need to do with the results*/)
のようなものので、無効なキーの失敗を取得した場合に、いくつかの再試行ロジックを追加する必要が
は思えます。 1つはあなたの副作用で、もう1つは最初のAPIキーが無効な場合に新しいAPIキーを取得しています。どちらにもラッパーは必要ありません。 – JohnWowUs
それは無効である可能性がありますが、私はこの方法でそれを処理するために求められますので、APIが開発される方法を制御できません。すべてのAPIレスポンスで検証を繰り返すのではなく、一般的なラッパーが意味を成す他のバリデーションもあります。副作用に関しては、私はあなたを得ていませんでした。これがより良い方法でどのように行われるのか説明してください。感謝:) –