簡體   English   中英

活動銷毀時取消注冊接口回調

[英]UnRegister interface callbacks when activity is destroyed

我正在開發一個完全依賴RESTful API的Android應用程序。 應用程序的幾乎每個屏幕都在進行網絡呼叫。 我正在使用以下幫助程序類來進行網絡請求。

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.util.Log;

import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.NetworkResponse;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

public class RequestHandler {
    private final String deviceID;
    private RequestQueue queue;
    private StringRequest stringRequest;
    private NetworkRequestListener networkRequestListener;
    private NetworkResponseListener networkResponseListener;
    private SharedPreferences sharedPreferences;

    public RequestHandler(Context context) {
        queue = Volley.newRequestQueue(context);
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
        deviceID = UtilityMethods.getDeviceId(context);
    }

    public void makeNetworkRequest(String url, int method, final String body) {
        stringRequest = new StringRequest(method, appendedURL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Log.e("RESPONSE", response);
                        if (networkResponseListener != null) {
                            networkResponseListener.onResponseLoaded(response);
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                if (networkResponseListener != null) {
                    networkResponseListener.onResponseFailed(error);
                }
            }
        }) {
            @Override
            public String getBodyContentType() {
                return "application/json; charset=utf-8";
            }

            @Override
            public byte[] getBody() {
                try {
                    return body.getBytes("utf-8");
                } catch (UnsupportedEncodingException | NullPointerException uee) {
                    VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", body, "utf-8");
                    return null;
                }
            }

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> headers = new HashMap<>();
                headers.put("version", AppConstants.VERSION);
                headers.put("Content-Type", "application/json");
                return headers;
            }

            @Override
            protected Response<String> parseNetworkResponse(NetworkResponse networkResponse) {
                String response = UtilityMethods.networkResponseToString(networkResponse);

                networkResponseListener.onResponseReceived(response);
                return super.parseNetworkResponse(networkResponse);
            }
        };

        stringRequest.setShouldCache(false);
        stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                0,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        if (networkRequestListener != null) {
            networkRequestListener.beforeMakeRequest(stringRequest);
        }
        queue.add(stringRequest);
    }

    public void setNetworkResponseListener(NetworkResponseListener networkResponseListener) {
        this.networkResponseListener = networkResponseListener;
    }

    public void setNetworkRequestListener(NetworkRequestListener networkRequestListener) {
        this.networkRequestListener = networkRequestListener;
    }

    public RequestQueue getQueue() {
        return queue;
    }

    public StringRequest getStringRequest() {
        return stringRequest;
    }
}

現在的問題是,我不知道一種取消網絡請求的方法(將回調接口設置為null也不起作用)。 如果網絡調用的響應是在活動被銷毀之后發生的,則處理程序方法將因上下文為空或視圖而拋出NPE(盡管活動被銷毀,但代碼仍在執行)。 當活動被破壞時,是否有可能取消/忽略網絡響應的方法? 同樣,如果可以改進此實現,因為幾乎所有活動都由於此類而導致內存泄漏。

像這樣在此類中創建一個方法

public static final String TAG = "MyTag";
StringRequest stringRequest; // Assume this exists.
RequestQueue queue;  // Assume this exists.

// Set the tag on the request.
stringRequest.setTag(TAG);

// Add the request to the RequestQueue.
queue.add(stringRequest);

public void cancelTag() {
    return queue.cancelAll(TAG);;
}

在活動onStop()將此調用為CancelTag()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM