2017-11-29 3 views
0

私は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をスローします(アクティビティは破棄されますが、コードはまだ実行されます)。アクティビティが破棄されたときにネットワーク応答をキャンセル/無視する方法はありますか?また、ほとんどすべてのアクティビティがこのクラスのためにメモリリークを起こしているため、この実装を改善できます。

+0

がヌルにコールバックインターフェースを設定するには、同様に動作していません。あなたはそれを実装する方法を共有できますか? –

答えて

0

活性におけるこの

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()

+0

ソース:https://developer.android.com/training/volley/simple.html –

関連する問題