web-dev-qa-db-ja.com

Android-ボレーリクエストをキャンセル

私はプロジェクトでAndroid Volley libを使用してネットワークリクエストを実行していますが、すべてうまく機能していますが、このlibの「キャンセル」機能に問題があります。問題を説明します。

OnCreateメソッドでリクエストを実行しているアクティビティがあります。リクエストが呼び出されます。問題ありません。ただし、cancelメソッドが機能することを確認するために、2つのことをテストして試してみました。

  1. 私は私の要求を実行し、次のようにキャンセルした直後:

    MySingleton.getMyData("urltocall", getDataListener, requestTag);MySingleton.getRequestQueue().cancelAll(requestTag);

これはうまくいきます!キャンセルが呼び出されます(私はVolleyのRequestクラスでも確認できます):

_public void cancel() {
        mCanceled = true; // my breakpoint is called here
    }
_
  1. リクエストを発行し、アクティビティのfinish()メソッドを呼び出した直後と、アクティビティのonDestroyまたはonStopメソッド、あるいはその両方で、同じコードを呼び出しています。

    MySingleton.getMyData("urltocall", getDataListener, requestTag);MySingleton.getRequestQueue().cancelAll(requestTag);

しかし、これは機能しません

RequestTagはnullではなく、Volleyに適切に渡されるため、最初のメソッドが機能するが他のメソッドが機能しない理由を理解できません... onDestroyが呼び出されたときにリクエストをキャンセルすることが私の目的であることを知っています。

ご協力いただきありがとうございます

14
ejay

私の推測では、最初のケースでは、リクエストはRequestQueueにのみ追加されているため、cancelAll()の呼び出しは機能します。 2番目のケースでは、リクエストの開始とActivityの一時停止/破棄の間にわずかな遅延があります。その遅延で、HTTPリクエストが開始されました。 cancelAll()の呼び出しは、まだRequestQueueにある要求に対してのみ機能することに気付かないかもしれません。すでに開始されているHTTPリクエストに対しては機能しません。これを停止する方法はありません。

そうは言っても、ドキュメント here は、リクエストがキャンセルされると(つまり、cancel()を呼び出すことによって)、Webサービスが呼び出されたことがないかのように効果的に処理できることを意味します最初の場所。特定の要求に関連付けられたコールバックは呼び出されません(受信した応答はおそらくローカルキャッシュに保持されます)。

17
Y.S

https://developer.Android.com/training/volley/simple.html#cancel

これは基本的に言う

キャンセルされると、Volleyは応答ハンドラーが呼び出されないことを保証します。

したがって、すでに開始されている(理にかなっている)httpリクエストを元に戻す/キャンセルする方法がない場合でも、リクエストに関連付けられたコールバックは呼び出されません。これは、ほとんどのシナリオでキャンセルできるリクエストであることを意味します。このようにしてサイレントに受信された応答は、キャッシュで使用できる場合があります。

7
mithril

Requestに接続されているTAGをキャンセルできます。したがって、基本的には、すべてのRequestとともにタグを追加する必要があります。

yourRequestObject.setTag(TAG);

_RequestQueue mRequestQueue;_

mRequestQueue.cancelAll(TAG);

このようにして、特定のRequestを持つすべてのTAGをキャンセルできます。

6
peeyush pathak

OnPause()メソッドで追加されたリクエストをキャンセルすることをお勧めします。考慮:

onPause()システムは、ユーザーがアクティビティを離れたことの最初の表示としてこのメ​​ソッドを呼び出します(ただし、アクティビティが破棄されているとは限りません)。これは通常、現在のユーザーセッションを超えて永続化する必要がある変更をコミットする場所です(ユーザーが戻ってこない可能性があるため)。出典: Android Developers

2
Andy