使用LeakCanary後,我發現我的應用程序中有很多泄漏,其中大部分是由於Volley的匿名回調監聽器造成的。所以我寫了一個Util(下面)類,它使用靜態回調和WeakReference
來保持對Context
的引用和匿名回調。但是,當我第一次打開應用程序,即冷啓動時,在請求完成後不久,上下文就會被打開,但在熱啓動期間,所有的工作都正常。這也只發生在應用程序中的第一個活動。排隊靜態回調監聽器上下文GCed
任何處理內存泄漏的替代方法都適用於正常工作的volley,這也是值得歡迎的。
public abstract class VUtil {
public static final String TAG = VUtil.class.getSimpleName();
public interface JsonCallback {
void onSuccess(JSONObject response);
}
public interface StringCallback {
void onSuccess(String response);
}
public interface ErrorCallback {
void onError(VolleyError error);
}
public static class JsonResponseListener implements Response.Listener<JSONObject> {
private final WeakReference<Context> mContextWeakReference;
private final WeakReference<JsonCallback> mCallbackWeakReference;
public JsonResponseListener(Context context, JsonCallback callback) {
mContextWeakReference = new WeakReference<>(context);
mCallbackWeakReference = new WeakReference<>(callback);
}
@Override
public void onResponse(JSONObject jsonObject) {
Context context = mContextWeakReference.get();
JsonCallback callback = mCallbackWeakReference.get();
if (context != null && callback != null) {
callback.onSuccess(jsonObject);
} else {
Log.d(TAG, "Context was GCed");
}
}
}
public static class StringResponseListener implements Response.Listener<String> {
private final WeakReference<Context> mContextWeakReference;
private final WeakReference<StringCallback> mCallbackWeakReference;
public StringResponseListener(Context context, StringCallback callback) {
mContextWeakReference = new WeakReference<>(context);
mCallbackWeakReference = new WeakReference<>(callback);
}
@Override
public void onResponse(String response) {
Context context = mContextWeakReference.get();
StringCallback callback = mCallbackWeakReference.get();
if (context != null && callback != null) {
callback.onSuccess(response);
} else {
Log.d(TAG, "Context was GCed");
}
}
}
public static class ErrorListener implements Response.ErrorListener {
private final WeakReference<Context> mContextWeakReference;
private final WeakReference<ErrorCallback> mCallbackWeakReference;
public ErrorListener(Context context, ErrorCallback callback) {
mContextWeakReference = new WeakReference<>(context);
mCallbackWeakReference = new WeakReference<>(callback);
}
@Override
public void onErrorResponse(VolleyError error) {
Context context = mContextWeakReference.get();
ErrorCallback callback = mCallbackWeakReference.get();
if (context != null && callback != null) {
callback.onError(error);
} else {
Log.d(TAG, "Context was GCed");
}
}
}
}
@ Sourabh如何在Stringrequest中傳遞該類對象,並從該響應中將該響應重定向到各自的活動響應 –
將對象傳遞爲「MyClass.this」?我不明白你的意思是'將不同活動的響應重定向到相應的活動響應' – Sourabh
我進行網絡呼叫,因此無論接收到什麼響應,我都必須將其重定向到特定活動。 –