現時点では、フラグメントの停止メソッドでmRequestQueue.cancelAll(getActivity())を使用していますが、どうやら電話を横長から縦長に移動すると、リクエストで作成されたデータが返されますが、ホルダーがデータはもう存在しません。それを適切に行う方法のサンプルコードはありますか?
CancelAllのタグを使用する代わりに、オールパスのRequestFilterを作成します。
mRequestQueue.cancelAll(new RequestQueue.RequestFilter() {
@Override
public boolean apply(Request<?> request) {
return true;
}
});
編集:これは、すべてのアクティビティ/フラグメントからのすべてのリクエストをキャンセルし、アクティビティライフサイクルではうまく機能しません。これを管理する最良の方法は、フラグメントに固有のStringタグを追加することです。
タグはメソッドではなくオブジェクトに設定する必要があります
タグをgetActivity()
に設定することで、バックグラウンドスレッドで発生しているリクエストへの参照としてメインスレッドで動的メソッド呼び出しを使用するようにVolleyに要求しています。
そのため、バックグラウンドスレッドがリクエストをキャンセルしようとしたときに、アクティビティがすでに停止している可能性があります。
getActivity()
を使用する代わりに、this
またはその他のオブジェクトや文字列を使用してください。
これはすべてのタグに適した方法であり、アクティビティのリークにも注意する必要があります。
ソリューション:
現在のオブジェクトを使用できます:
request.setTag(this);
または、静的クラスオブジェクト
request.setTag(MyFragment.class);
または、別のクラスの定数として:
request.setTag(CustomTags.LIST_REQUESTS);
CustomTags.LIST_REQUESTSは私の意見では最高です(アクティビティをリークする可能性は低いです)
このようなもの:
public class CustomTags
{
public static final String LIST_REQUESTS="CustomTags:LIST_REQUESTS";
}
更新
私はVolleyで自分のリクエストにタグを付ける際に間違いを犯していることに気づきました(上で投稿したソリューションは問題ありませんが)。
ここでも、覚えておくべき重要なことを更新すると思いました。 identityによるVolleyタグはvalueではありません。
したがって、同じオブジェクト自体ではなく、単に同じ文字列値であるタグは、同じtag
として認識されないことに注意することが重要です。
それは違いに似ています
String a1 = "A";
String a2 = "A";
a1 == a2; //evaluates to false
String a1 = "A";
String a2 = "A";
a1.equals(a2); // evaluates to true
私はこの答えが遅いことを知っていますが、他の誰かがこの問題を抱えている場合に備えて:
私の実装では、リクエストがキューに追加された時点でタグが設定(および上書き)されていました。
したがって、タグを使用してリクエストをキャンセルしているにもかかわらず、リクエストキューのタグは同じではなく(以前は上書きされていたため)、キャンセルされませんでした。
実行中のリクエストをログに記録し、タグを印刷して、解決策を見つけました:
mRequestQueue.cancelAll(new RequestQueue.RequestFilter() {
@Override
public boolean apply(Request<?> request) {
Log.d("DEBUG","request running: "+request.getTag().toString());
return true;
}
});
リクエスト時にどのタグを使用しましたか?各リクエストにタグを設定しなかった場合、機能しない可能性があります。私の知る限り、Volleyはリクエストにタグを自動的に設定しません
この記事を確認してください。シングルバスのイベントバスとしてOtoを使用しています。このようにして、アクティビティまたはフラグメントが再作成されたときにボレーキューに通知できます。もちろん、代わりにプレーンな古いインターフェースを使用して、変更をリッスンすることもできます。 BUt Ottoは、統一されたソリューションとして、それほど冗長ではなくエレガントに見えます。
http://andraskindler.com/blog/2013/eventbus-in-Android-an-otto-example/
断片の場合; 1つだけ使用してくださいRequestQueue rQueue;
OnCreate method;
で初期化し、すべてのボレーリクエストに使用します。そして最後に
@オーバーライド
public void onStop () {
super.onStop();
if (rQueue != null) {
rQueue.cancelAll(this);
}
}
アクティビティのリクエストのタグを設定していますか?これが、提供するコードが機能する唯一の方法です。 cancelAllメソッドは、指定したタグのタグを持つすべてのリクエストを検索し、それらをキャンセルします。
リクエストをフレームからキューに追加する場合は、mRequestQueue.cancelAll(this)
のようにキャンセルする必要があります。うまくいかなくて申し訳ありません-私はこのソリューションをテストしていません。しかし、私はこれがあなたに役立つことを願っています。