2016-06-10 2 views
2

J'utilise la bibliothèque [Jobqueue] en utilisant la requête de synchronisation avec Volley. Tout est ok, mais après une longue période ou l'exécution d'un grand nombre de demandes après une durée indéterminée, j'obtiens cette erreur: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) 

Ce bug est très bizarre, car une fois que je reçois cette erreur, les demandes ne fonctionnent plus . J'ai essayé beaucoup de choses comme avoir un RequestQueue par tâche au lieu d'avoir une instance d'application RequestQueue, annuler tous les jobs et réinitialiser les jobs et les requêtes dans RequestQueue.

Voici un exemple de la façon dont je suis utiliser une demande de synchronisation avec 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) { 

    } 

J'ai oublié de commentaires que j'ai un délai d'attente pour chaque demande de 15 secondes et le nombre maximum de tentatives de reprise de volée est 0

Une idée?

Répondre

2

Enfin, j'ai corrigé ce bug en remplaçant Volley par Retrofit en raison des requêtes de cache de la bibliothèque Google, revenant toujours dans le même thread (thread principal) et quelque chose semble être bloqué avec les requêtes de synchronisation.

Une meilleure explication se fait dans ce post: https://solidgeargroup.com/android-priority-job-queue-background-tasks

+0

Si ma mémoire est bonne, retrofit appelle aussi les callbacks onSuccess sur thread principal – Pnemonic

+0

Oui, vous avez raison. J'ai oublié de mettre mes recherches sur le cache. Oui, c'est une supposition mais si vous savez comment résoudre ce problème, répondez s'il vous plaît. –

+0

Avez-vous des nouvelles de votre problème d'origine? – anthony