【发布时间】:2014-08-18 16:19:18
【问题描述】:
当我重新创建我的 Activity(更改设备方向)并等待 Volley 请求响应时,“onResponse”上的代码没有任何效果,因为它正在被破坏的 Activity 上运行。
这是基本情况。为了方便起见,我只使用“mWaitingServerResponse”作为关键信息。这工作正常:
public void onLoginButtonClick(View view) {
// Store we are waiting for server
mWaitingServerResponse = true;
sendLoginRequest();
}
public void sendLoginRequest() {
StringRequest loginRequest = new StringRequest(
Request.Method.GET, url, null,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// Store we are not waiting for server anymore
mWaitingServerResponse = false;
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// Store we are not waiting for server anymore
mWaitingServerResponse = false;
}
});
mVolley.addToRequestQueue(loginRequest);
}
然后将“mWaitingServerResponse”的值与 savedInstanceState 一起记住。
因此,当 onResponse 运行时,它会更改已销毁活动的“mWaitingServerResponse”值,而不是更改设备方向更改后创建的活动的值。我怎样才能让 onRespond 对新活动采取行动?
【问题讨论】:
-
为什么不尝试取消之前的请求并再次提出新的请求?
-
@mmlooloo 我不想丢失已经运行的请求的进度。我曾想过保持活动本身的静态引用。这将由 onResponse 使用并更新 onCreate。但是,保持对 Activity 本身的静态引用听起来很奇怪。
-
我也认为我的方法泄露了活动:我不应该为侦听器使用匿名类,而是使用静态嵌套类。反正我还在猜测,如果有人能证实,那就太好了。
-
服务器是否将您的文件设置为可缓存?
-
@efrel 1) 在可能有多个实例的活动的情况下,创建静态引用会很麻烦。 2)我很确定它至少会在请求完成之前泄漏活动。但是请求完成后我不太确定。
标签: android android-activity android-volley