私はプロジェクトでAndroid Volley libを使用してネットワークリクエストを実行していますが、すべてうまく機能していますが、このlibの「キャンセル」機能に問題があります。問題を説明します。
OnCreate
メソッドでリクエストを実行しているアクティビティがあります。リクエストが呼び出されます。問題ありません。ただし、cancel
メソッドが機能することを確認するために、2つのことをテストして試してみました。
私は私の要求を実行し、次のようにキャンセルした直後:
MySingleton.getMyData("urltocall", getDataListener, requestTag);
MySingleton.getRequestQueue().cancelAll(requestTag);
これはうまくいきます!キャンセルが呼び出されます(私はVolleyのRequestクラスでも確認できます):
_public void cancel() {
mCanceled = true; // my breakpoint is called here
}
_
リクエストを発行し、アクティビティのfinish()メソッドを呼び出した直後と、アクティビティのonDestroy
またはonStop
メソッド、あるいはその両方で、同じコードを呼び出しています。
MySingleton.getMyData("urltocall", getDataListener, requestTag);
MySingleton.getRequestQueue().cancelAll(requestTag);
しかし、これは機能しません!
RequestTagはnullではなく、Volleyに適切に渡されるため、最初のメソッドが機能するが他のメソッドが機能しない理由を理解できません... onDestroy
が呼び出されたときにリクエストをキャンセルすることが私の目的であることを知っています。
ご協力いただきありがとうございます
私の推測では、最初のケースでは、リクエストはRequestQueue
にのみ追加されているため、cancelAll()
の呼び出しは機能します。 2番目のケースでは、リクエストの開始とActivity
の一時停止/破棄の間にわずかな遅延があります。その遅延で、HTTPリクエストが開始されました。 cancelAll()
の呼び出しは、まだRequestQueue
にある要求に対してのみ機能することに気付かないかもしれません。すでに開始されているHTTPリクエストに対しては機能しません。これを停止する方法はありません。
そうは言っても、ドキュメント here は、リクエストがキャンセルされると(つまり、cancel()
を呼び出すことによって)、Webサービスが呼び出されたことがないかのように効果的に処理できることを意味します最初の場所。特定の要求に関連付けられたコールバックは呼び出されません(受信した応答はおそらくローカルキャッシュに保持されます)。
https://developer.Android.com/training/volley/simple.html#cancel
これは基本的に言う
キャンセルされると、Volleyは応答ハンドラーが呼び出されないことを保証します。
したがって、すでに開始されている(理にかなっている)httpリクエストを元に戻す/キャンセルする方法がない場合でも、リクエストに関連付けられたコールバックは呼び出されません。これは、ほとんどのシナリオでキャンセルできるリクエストであることを意味します。このようにしてサイレントに受信された応答は、キャッシュで使用できる場合があります。
Request
に接続されているTAG
をキャンセルできます。したがって、基本的には、すべてのRequest
とともにタグを追加する必要があります。
yourRequestObject.setTag(TAG);
_RequestQueue mRequestQueue;
_
mRequestQueue.cancelAll(TAG);
このようにして、特定のRequest
を持つすべてのTAG
をキャンセルできます。
OnPause()メソッドで追加されたリクエストをキャンセルすることをお勧めします。考慮:
onPause()システムは、ユーザーがアクティビティを離れたことの最初の表示としてこのメソッドを呼び出します(ただし、アクティビティが破棄されているとは限りません)。これは通常、現在のユーザーセッションを超えて永続化する必要がある変更をコミットする場所です(ユーザーが戻ってこない可能性があるため)。出典: Android Developers