2017-11-16 2 views
4

Verwendung Während meiner Android-Anwendung Entwicklung erhalte ich diese Warnung in meinem LogcatOkhttp zeigende Warnung durchgesickert, während mit Volley

WARNING: A connection to https://... was leaked. Did you forget to close a response body? 

Ich verwende Okhttps als Transportschicht für das Volley für Netztelefonie.

class OkHttpStack extends HurlStack { 

private final OkUrlFactory okUrlFactory; 

    OkHttpStack() { 
     this(new OkUrlFactory(new OkHttpClient())); 
    } 

    private OkHttpStack(OkUrlFactory okUrlFactory) { 
     if (okUrlFactory == null) { 
      throw new NullPointerException("Client must not be null."); 
     } 
     this.okUrlFactory = okUrlFactory; 
    } 

    @Override 
    protected HttpURLConnection createConnection(URL url) throws 
    IOException { 
     return okUrlFactory.open(url); 
    } 

} 

Für Request

synchronized RequestQueue getRequestQueue() { 
    if (mRequestQueue == null) { 
     mRequestQueue = Volley.newRequestQueue(mContext,new OkHttpStack()); 
    } 
    return mRequestQueue; 
} 
<T> void addToRequestQueue(Request<T> req) { 
    getRequestQueue().add(req); 
} 

Schaffung Ich rufe URL wie dieses

public void postCall(final String Url, JSONObject Data, final ResponseCallback responseCallback){ 

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(mUrl+Url, Data, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        Log.d(TAG,response.toString()); 
        responseCallback.onGettingResponse(response); 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.d(TAG,error.toString()); 
        responseCallback.onError(error); 
       } 
      }); 
    jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(
      TIMEOUT_IN_SECONDS, 
      0, 
      0)); 

    mRestApiCall.getInstance(mContext).addToRequestQueue(jsonObjectRequest.setTag(mRequestTag)); 

} 

Von Okhttp Ausgaben tracker, las ich, dass wir jedes Mal schließen müssen, um die Antwort Körper zu vermeiden lecke aber ich verstehe es nicht, wie man das macht, während man Volley und Okhttp benutzt.

Abhängigkeiten:

compile 'com.android.volley:volley:1.0.0' 
compile 'com.squareup.okhttp3:okhttp:3.9.0' 
compile 'com.squareup.okhttp:okhttp-urlconnection:2.4.0' 
+0

https://stackoverflow.com/questions/47025025/android-volley-memory-leaks –

+0

Bitte entfernen Sie die HTTP-Protokollierung, die für dieses Problem einer der Gründe ist – Praveen

Antwort

0

Sie den vollständigen Code nicht hier zeigt ich denke, diese Nachricht aufgrund neuer Anruf ist nicht geschlossen.

private String get(final String url) { 
String res = null; 
try { 
    final Request req = new Request.Builder().url(url).get().build(); 
    final Response resp = ok.newCall(req).execute(); 
    final int code = resp.code(); 
    if (code == 200) { 
     final ResponseBody body = resp.body(); 
     res = body.string(); 
    } 
} 
catch (final Throwable th) { 
    System.out.println(th.getMessage()); 
    } 
finally() { 
    body.close(); // this would be missing somewhere in your code where you are receiving your response 
} 
return res; 
+0

ich meine url den Code aktualisieren für den Aufruf – sasuke

Verwandte Themen