为什么在活动被破坏后凌空调用onResponse

时间:2018-01-12 04:00:06

标签: java android android-volley

我在我的活动类中创建了以下代码,即MainActivity.java。在这 代码应用程序访问服务器localhost。服务器端只是一个简单的PHP脚本 其中睡3秒,用于测试目的并返回简单的json数据。然后我做了 以下步骤,
1.启动我的应用程序
2.活动出现了,MainActivity.java
然后我立即按下按钮(活动被破坏)
4.大约2秒后,来自吐司的消息出现。

我不明白的事情是为什么onResponse方法,写在活动内部,即使在 活动被销毁,Toast.makeText()内的关键字不为空。

我测试了这个代码近十次。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    commitData();
    .
    .
}
@Override
public void onResponse(Object response) {
    try {
        if (response instanceof String) {
            String jsonString = String.valueOf(response);
            JSONObject jsonObject = new JSONObject(jsonString);
            if (jsonObject.getInt("flag") < 0){
                Toast.makeText(this, "Response success [OK].", Toast.LENGTH_LONG).show();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
private void commitData() {
    .
    .
    Map<String, String> params = new HashMap<>();
    params.put("id", "my_id");
    .
    .
    stringRequest.setShouldCache(false);
    requestQueue.add(stringRequest);
}

1 个答案:

答案 0 :(得分:0)

在Volley中,所有网络和缓存调度都在一个单独的线程(引擎盖后)完成,同时响应被发送回主线程。这只意味着onResponse和onError发生在主线程中。 为了说明,请参见下图:在此输入图像描述

enter image description here

完成()只是隐藏,停止和销毁您的活动。你的进程仍然在运行。关于Destroy的Cancel the Volley request的最佳实践,您可以通过调用此对象上的cancel()取消Toast消息来取消它。