18

Square の Retrofit Client を使用して、Android アプリから短命の json リクエストを作成しています。リクエストをキャンセルする方法はありますか?もしそうなら、どのように?

4

7 に答える 7

3

コールバックも実装するデリゲート オブジェクトにコールバックをラップします。何らかのメソッドを呼び出してデリゲートをクリアし、応答を受け取るたびに何もしないようにします。

次の議論を見てください

https://plus.google.com/107765816683139331166/posts/CBUQgzWzQjS

より良い戦略は、コールバックの実行をキャンセルすることです

https://stackoverflow.com/a/23271559/1446469

于 2013-10-09T09:15:25.337 に答える
3

回答に基づいてキャンセル可能なコールバック クラスを実装しました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);
于 2015-08-14T15:00:37.290 に答える
2

これはレトロフィット 2.0 用です。call.cancel()メソッドがあり、飛行中の呼び出しもキャンセルします。以下は、そのドキュメント定義です。

retrofit2.Call

public abstract void cancel()

この通話をキャンセルします。実行中の呼び出しをキャンセルしようとしますが、呼び出しがまだ実行されていない場合はキャンセルされません。

于 2016-03-10T06:34:29.287 に答える
1

Retrofit V 2.0.0.beta2 の最新バージョンには簡単な方法があります。リトライも実装できます。
ここを見てくださいRetrofit.client.UrlConnectionClient がクライアントとして使用されている場合、レトロフィットで進行中のリクエストをキャンセルする方法は?

于 2015-10-01T12:10:53.263 に答える
0

少し遅れるかもしれませんが、解決策を見つけた可能性があります。リクエストが実行されるのを防ぐことはできませんでしたが、リクエストが実行されて何もしないことに満足している場合は、この質問と回答を確認してください。どちらも私が作成したものです。

于 2014-04-24T18:24:16.020 に答える