Square の Retrofit Client を使用して、Android アプリから短命の json リクエストを作成しています。リクエストをキャンセルする方法はありますか?もしそうなら、どのように?
7 に答える
コールバックも実装するデリゲート オブジェクトにコールバックをラップします。何らかのメソッドを呼び出してデリゲートをクリアし、応答を受け取るたびに何もしないようにします。
次の議論を見てください
https://plus.google.com/107765816683139331166/posts/CBUQgzWzQjS
より良い戦略は、コールバックの実行をキャンセルすることです
回答に基づいてキャンセル可能なコールバック クラスを実装しましたhttps://stackoverflow.com/a/23271559/5227676
public abstract class CancelableCallback<T> implements Callback<T> {
private static List<CancelableCallback> mList = new ArrayList<>();
private boolean isCanceled = false;
private Object mTag = null;
public static void cancelAll() {
Iterator<CancelableCallback> iterator = mList.iterator();
while (iterator.hasNext()){
iterator.next().isCanceled = true;
iterator.remove();
}
}
public static void cancel(Object tag) {
if (tag != null) {
Iterator<CancelableCallback> iterator = mList.iterator();
CancelableCallback item;
while (iterator.hasNext()) {
item = iterator.next();
if (tag.equals(item.mTag)) {
item.isCanceled = true;
iterator.remove();
}
}
}
}
public CancelableCallback() {
mList.add(this);
}
public CancelableCallback(Object tag) {
mTag = tag;
mList.add(this);
}
public void cancel() {
isCanceled = true;
mList.remove(this);
}
@Override
public final void success(T t, Response response) {
if (!isCanceled)
onSuccess(t, response);
mList.remove(this);
}
@Override
public final void failure(RetrofitError error) {
if (!isCanceled)
onFailure(error);
mList.remove(this);
}
public abstract void onSuccess(T t, Response response);
public abstract void onFailure(RetrofitError error);
}
使用例
rest.request(..., new CancelableCallback<MyResponse>(TAG) {
@Override
public void onSuccess(MyResponse myResponse, Response response) {
...
}
@Override
public void onFailure(RetrofitError error) {
...
}
});
// if u need to cancel all
CancelableCallback.cancelAll();
// or cancel by tag
CancelableCallback.cancel(TAG);
これはレトロフィット 2.0 用です。call.cancel()メソッドがあり、飛行中の呼び出しもキャンセルします。以下は、そのドキュメント定義です。
retrofit2.Call
public abstract void cancel()
この通話をキャンセルします。実行中の呼び出しをキャンセルしようとしますが、呼び出しがまだ実行されていない場合はキャンセルされません。
Retrofit V 2.0.0.beta2 の最新バージョンには簡単な方法があります。リトライも実装できます。
ここを見てくださいRetrofit.client.UrlConnectionClient がクライアントとして使用されている場合、レトロフィットで進行中のリクエストをキャンセルする方法は?
少し遅れるかもしれませんが、解決策を見つけた可能性があります。リクエストが実行されるのを防ぐことはできませんでしたが、リクエストが実行されて何もしないことに満足している場合は、この質問と回答を確認してください。どちらも私が作成したものです。