私はAndroidアプリケーションを使用していますが、これは完全にRESTful APIに依存しています。アプリケーションのほぼすべての画面がネットワークコールを行っています。私はネットワークリクエストを作成するためにヘルパークラスを使用しています。これでアクティビティが破棄されたときのインタフェースコールバックの登録解除
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をスローします(アクティビティは破棄されますが、コードはまだ実行されます)。アクティビティが破棄されたときにネットワーク応答をキャンセル/無視する方法はありますか?また、ほとんどすべてのアクティビティがこのクラスのためにメモリリークを起こしているため、この実装を改善できます。
がヌルにコールバックインターフェースを設定するには、同様に動作していません。あなたはそれを実装する方法を共有できますか? –