Volley中listener導致的記憶體洩露
專案中用Volley作為http框架,封裝了一個JsonRequest,效能優化的時候,LeakCanary一直提示Volley的listener記憶體洩露,檢查了很久也沒發現哪裡出現記憶體洩露
public class JsonRequestImpl extends JsonRequest<JSONObject > {
public JsonRequestImpl(int method, String url,
JSONObject jsonRequest,
Response.Listener<JSONObject> listener,
Response.ErrorListener errorListener) {
super( method,
url,
(jsonRequest == null) ? null : jsonRequest.toString(),
listener,
errorListener);
}
public JsonRequestImpl(String url,
JSONObject jsonRequest,
Response.Listener<JSONObject> listener,
Response.ErrorListener errorListener) {
this( jsonRequest == null ? Request.Method.GET : Request.Method.POST,
url,
jsonRequest,
listener,
errorListener);
}
/**
* @param response
* @return
*/
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString =
new String(response.data, HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
/**
* 設定超時
* @return
*/
@Override
public RetryPolicy getRetryPolicy() {//設定超時
RetryPolicy retryPolicy= new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
return retryPolicy;
}
/**
* 設定header
* @return
* @throws AuthFailureError
*/
@Override
public Map<String, String> getHeaders() throws AuthFailureError {//新增header
Map<String,String> map=new HashMap<String,String>();
map.put("Accept", "application/json");
map.put("Content-Type", "application/json; charset=UTF-8");
return map;
}
}
獲取Volley請求佇列的時候
requestQueue = Volley.newRequestQueue(context.getApplicationContext());並沒有直接傳進Activity例項進來,而是使用全域性唯一的context上下文。
傳送請求的時候加TAG,介面離開前臺的時候直接在onPause裡邊取消標記為TAG的網路請求。
還是找不到記憶體洩露的原因,網上查了下資料,說是Volley自己的一個小bug
原來使用的Volley版本是:
compile 'eu.the4thfloor.volley:com.android.volley:2015.01.06'
改為
compile 'com.mcxiaoke.volley:library:1.0.19'
後果然就不再提示記憶體洩露的問題了
unofficial mirror (with some minor bugfix) for volley.
相關文章
- android Handler導致的記憶體洩露Android記憶體洩露
- SQL Server 記憶體洩露(memory leak)——遊標導致的記憶體問題SQLServer記憶體洩露
- IE中的記憶體洩露記憶體洩露
- 可能會導致.NET記憶體洩露的8種行為記憶體洩露
- SQL Server 記憶體洩露”(memory leak)的案例—遊標導致的記憶體問題SQLServer記憶體洩露
- JavaScript中的記憶體洩露模式JavaScript記憶體洩露模式
- 記憶體洩露記憶體洩露
- 記一次 redis 事件註冊不當導致的記憶體洩露Redis事件記憶體洩露
- Go坑:time.After可能導致的記憶體洩露問題分析Go記憶體洩露
- js記憶體洩露JS記憶體洩露
- JavaScript記憶體洩露JavaScript記憶體洩露
- 記憶體洩露嗎記憶體洩露
- SHBrowseForFolder 記憶體洩露記憶體洩露
- Android中Handler引起的記憶體洩露Android記憶體洩露
- 如何診斷 Java 中的記憶體洩露Java記憶體洩露
- Android 中 Handler 引起的記憶體洩露Android記憶體洩露
- js記憶體洩露的原因JS記憶體洩露
- Java記憶體洩露的原因Java記憶體洩露
- JAVA 記憶體洩露的理解Java記憶體洩露
- 記憶體溢位和記憶體洩露記憶體溢位記憶體洩露
- java中如何檢視記憶體洩露Java記憶體洩露
- Lowmemorykiller記憶體洩露分析記憶體洩露
- 避免PHP-FPM記憶體洩漏導致記憶體耗盡PHP記憶體
- 檢視 Node.js 中的記憶體洩露Node.js記憶體洩露
- 記憶體洩露引起的問題記憶體洩露
- ThreaLocal記憶體洩露的問題記憶體洩露
- 異常連線導致的記憶體洩漏排查記憶體
- 使用 mtrace 分析 “記憶體洩露”記憶體洩露
- 實戰Go記憶體洩露Go記憶體洩露
- 學習Java:記憶體洩露Java記憶體洩露
- JavaScript 中 4 種常見的記憶體洩露陷阱JavaScript記憶體洩露
- Java 中 ThreadLocal 記憶體洩露的例項分析Javathread記憶體洩露
- Android中的Activitys, Threads和記憶體洩露Androidthread記憶體洩露
- 如何避免JavaScript的記憶體洩露及記憶體管理技巧JavaScript記憶體洩露
- ArkTS 的記憶體快照與記憶體洩露除錯記憶體洩露除錯
- 記一次Go websocket 專案記憶體洩露排查 + 使用Go pprof定位記憶體洩露GoWeb記憶體洩露
- python 記憶體洩露的診斷Python記憶體洩露
- Android 記憶體洩露詳解Android記憶體洩露