2016-06-10 4 views
2

Ich benutze [Jobqueue] Bibliothek mit Sync-Anfrage mit Volley. Alles ist in Ordnung, aber nach langer Zeit oder viele Anfragen nach einer unbestimmten Zeit durchgeführt wird, erhalte ich diese Fehlermeldung:VolleyError: java.lang.IllegalArgumentException: timeout <0

Caused by: com.android.volley.VolleyError: java.lang.IllegalArgumentException: timeout < 0 
     at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:141) 
Caused by: java.lang.IllegalArgumentException: timeout < 0 
     at java.net.Socket.setSoTimeout(Socket.java:521) 
     at com.android.okhttp.internal.http.HttpTransport.discardStream(HttpTransport.java:193) 
     at com.android.okhttp.internal.http.HttpTransport.makeReusable(HttpTransport.java:170) 
     at com.android.okhttp.internal.http.HttpEngine.release(HttpEngine.java:445) 
     at com.android.okhttp.internal.http.AbstractHttpInputStream.endOfInput(AbstractHttpInputStream.java:86) 
     at com.android.okhttp.internal.http.HttpTransport$FixedLengthInputStream.read(HttpTransport.java:394) 
     at java.io.InputStream.read(InputStream.java:162) 
     at com.android.volley.toolbox.BasicNetwork.entityToBytes(BasicNetwork.java:238) 
     at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:123) 
     at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112) 

Dieser Fehler ist sehr seltsam, denn wenn ich diese Fehlermeldung erhalten, Anfragen werden nicht mehr funktioniert . Ich habe eine Menge Dinge probiert, wie zum Beispiel eine RequestQueue pro Job, anstatt eine App-Instanz RequestQueue zu haben, alle Jobs abzubrechen und Jobs und Anfragen in der RequestQueue zurückzusetzen.

Dies ist ein Beispiel dafür, wie ich bin eine Synchronisationsanforderung mit Volley:

public class FetchBlacklistJob extends Job { 

    public static final String TAG = FetchBlacklistJob.class.getCanonicalName(); 

    public FetchBlacklistJob(String groupId) { 
     super(new Params(Constants.JOB_PRIORITY.HIGH.getValue()) 
       .addTags(TAG) 
       .setGroupId(groupId) 
       .singleInstanceBy(TAG) 
       .requireNetwork()); 
    } 

    @Override 
    public void onAdded() { 

    } 

    @Override 
    public void onRun() throws Throwable { 

     RequestFuture<Blacklist> syncCallback = RequestFuture.newFuture(); 
     GetBlacklistRequest request = new GetBlacklistRequest(currentBlacklist, 
       syncCallback, syncCallback); 
     syncCallback.setRequest(VolleyManager.getInstance().addRequest(request)); 

     Blacklist response = syncCallback.get(VolleyManager.TIMEOUT, TimeUnit.MILLISECONDS); 

     if (response == null || response.getBlacklist() == null) { 
      Log.d(TAG, "response null, skipping..."); 
      return; 
     } 

     DBUtils.saveBlacklist(response); 
    } 

    @Override 
    protected void onCancel(int cancelReason, @Nullable Throwable throwable) { 

    } 

I Kommentar vergessen zu, dass ich ein Timeout für jede Anforderung von 15 Sekunden und max Anzahl der Wiederholungen habe in Volley 0

Irgendeine Idee?

Antwort

2

Endlich habe ich diesen Bug behoben, der Volley durch Retrofit ersetzt, da die Google-Bibliothek Cache-Anfragen immer im selben Thread (Haupt-Thread) zurückgibt und etwas mit Sync-Anfragen blockiert zu sein scheint.

Eine bessere Erklärung wird in diesem Beitrag nicht getan: https://solidgeargroup.com/android-priority-job-queue-background-tasks

+0

Wenn der Speicher dient, Retrofit ruft auch die Rückrufe onSuccess auf Hauptthread – Pnemonic

+0

Ja, du hast recht. Ich habe vergessen, meine Nachforschungen über Cache zu machen. Ja, es ist eine Vermutung, aber wenn Sie wissen, wie Sie dieses Problem beheben können, antworten Sie bitte. –

+0

Haben Sie Neuigkeiten zu Ihrem ursprünglichen Problem? – anthony