我正在使用抽排库来进行Web服务调用。我做了一个普通的课程,让所有的Web服务调用并从那里进行服务调用,并为成功和错误响应创建匿名监听器。引起内存泄漏的抽象请求的匿名侦听器
但是,当我使用泄漏金丝雀它显示内存泄漏相关的上下文。以下是我的代码片段:
public void sendRequest(final int url, final Context context, final ResponseListener responseListener, final Map<String, String> params) {
StringRequest stringRequest;
if (isNetworkAvailable(context)) {
stringRequest = new StringRequest(methodType, actualURL + appendUrl, new Listener<String>() {
@Override
public void onResponse(String response) {
dismissProgressDialog(context);
try {
(responseListener).onResponse(url, response);
} catch (JsonSyntaxException e) {
// Util.showToast(context, context.getResources().getString(R.string.error));
Crashlytics.logException(e);
}
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// Util.showToast(context,context.getString(R.string.error));
dismissProgressDialog(context);
if (error instanceof NetworkError) {
Util.showToast(context, context.getResources().getString(R.string.network_error));
} else if (error instanceof NoConnectionError) {
Util.showToast(context, context.getResources().getString(R.string.server_error));
} else if (error instanceof TimeoutError) {
Util.showToast(context, context.getResources().getString(R.string.timeout_error));
} else {
Util.showToast(context, context.getResources().getString(R.string.default_error));
}
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return request.getHeaders(context, actualURL, false);
}
};
stringRequest.setRetryPolicy(new DefaultRetryPolicy(30000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
VolleySingleton.getInstance(context).addRequest(stringRequest);
} else {
Util.showToast(context, context.getString(R.string.internet_error_message));
}
}
而且我创建了一个名为响应侦听器的接口,用于将响应重定向到活动或片段。我提出如下请求。
Request.getRequest().sendRequest(Request.SOME URL, SplashScreenActivity.this, SplashScreenActivity.this, new HashMap<String, String>());
但我面对的内存泄漏为:
In 2.1.1:31.
* activity.SplashScreenActivity has leaked:
* GC ROOT com.android.volley.NetworkDispatcher.<Java Local>
* references network.Request$5.mListener (anonymous subclass of com.android.volley.toolbox.StringRequest)
* references network.Request$3.val$responseListener (anonymous implementation of com.android.volley.Response$Listener)
* leaks activity.SplashScreenActivity instance
* Retaining: 1.2MB.
* Reference Key: b8e318ea-448c-454d-9698-6f2d1afede1e
* Device: samsung samsung SM-G355H kanas3gxx
* Android Version: 4.4.2 API: 19 LeakCanary: 1.4 6b04880
* Durations: watch=5052ms, gc=449ms, heap dump=2617ms, analysis=143058ms
任何想法,以消除这种泄漏任何帮助表示赞赏。
@拿烟塔瓦u能请编辑代码即时消息没有得到如何在现有代码 –
而不是解决这个问题'''新的监听(){ @覆盖 公共无效onResponse(字符串响应){ dismissProgressDialog(上下文) ; try { (responseListener).onResponse(url,response); catch(JsonSyntaxException e){ // Util.showToast(context,context.getResources()。getString(R.string.error)); Crashlytics.logException(e); } } }'''直接创建一个实现这个类的类并传递这个类Object在 –
里我必须创建实现了Listner接口的类,并且必须在那里传递那个类对象。像类ResponseClass实现了Listener,ErrorListener {覆盖public void onResponse(Object response){}覆盖public void onErrorResponse(VolleyError error){}} –