摘自:http://www.oschina.net/question/1781692_2133941
这几天发现Volley的网络请求有 内存溢出 现象。(检测工具是MAT,LeakCanary)
感觉现象很常见,也许大家还没发现,或着已经解决
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
public
class
HeapTestActivity
extends
Activity {
TextView heapText;
/** Volley框架的请求队列 **/
public
RequestQueue mRequestQueue ;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super
.onCreate(savedInstanceState);
setContentView(R.layout.heap_test);
mRequestQueue= Volley.newRequestQueue(
this
);
heapText=(TextView)findViewById(R.id.heapText);
getData();
}
String url=
"http://route.showapi.com/341-2"
;//笑话大全的API接口
HashMap<String, String> postMap;
public
void
getData() {
postMap =
new
HashMap<>();
postMap.put(
"showapi_appid"
,
"10073"
);
postMap.put(
"showapi_sign"
,
"8131cde1a4234008b25f2450e515607c"
);
postMap.put(
"showapi_timestamp"
, DateUtil.getOrderNum());
StringRequest arrayPostRequest =
new
StringRequest(Request.Method.POST,url,
new
Response.Listener<String>() {
//此匿名内部类,里面的线程会持有Activity的引用导致无法释放
@Override
public
void
onResponse(String response) {
//请求成功
heapText.setText(response);
}
},
new
Response.ErrorListener() {
@Override
public
void
onErrorResponse(VolleyError error) {
//请求错误
}
}) {
@Override
protected
Map<String, String> getParams() {
return
postMap;
}
};
arrayPostRequest.setTag(
"StringRequest"
);
mRequestQueue.add(arrayPostRequest);
}
@Override
protected
void
onDestroy() {
// TODO Auto-generated method stub
super
.onDestroy();
mRequestQueue.cancelAll(
this
);
}
}
|
LeakCanary工具显示:StringRequest的参数,有个匿名内部类监听一直持有HeapTestActivity 这个对象,导致无法释放。
MAT工具显示如下图: