Android - Volley RequestFuture Délai D'Attente
Je suis confronté à un problème lors de l'utilisation de la RequestFuture classe de volley.
En fait il s'arrête juste à wait(0)
; à l'intérieur de la doGet()
Fonction dans le RequestFuture catégorie ci-dessous et n'est jamais réveillé par onResponse
ou onErrorResponse
que je pense qu'il devrait.
private synchronized T doGet(Long timeoutMs)
throws InterruptedException, ExecutionException, TimeoutException {
if (mException != null) {
throw new ExecutionException(mException);
}
if (mResultReceived) {
return mResult;
}
if (timeoutMs == null) {
wait(0);
} else if (timeoutMs > 0) {
wait(timeoutMs);
}
if (mException != null) {
throw new ExecutionException(mException);
}
if (!mResultReceived) {
throw new TimeoutException();
}
return mResult;
}
@Override
public boolean isCancelled() {
if (mRequest == null) {
return false;
}
return mRequest.isCanceled();
}
@Override
public synchronized boolean isDone() {
return mResultReceived || mException != null || isCancelled();
}
@Override
public synchronized void onResponse(T response) {
mResultReceived = true;
mResult = response;
notifyAll();
}
@Override
public synchronized void onErrorResponse(VolleyError error) {
mException = error;
notifyAll();
}
C'est la façon dont j'essaie d'appeler tout cela ci-dessus.
RequestFuture<JSONObject> future = RequestFuture.newFuture();
JsonObjectRequest myReq = new JsonObjectRequest(Request.Method.POST, url, jsonObj, future, future);
requestQueue.add(myReq);
try {
JSONObject response = future.get();
} catch (InterruptedException e) {
//handle the error
} catch (ExecutionException e) {
//handle the error
}
J'ai aussi essayé de remplacer la ligne
requestQueue.add(myReq);
avec
future.setRequest(requestQueue.add(myReq));
ou
future.setRequest(myReq);
qui n'a pas aidé non plus.
J'ai déjà essayé une habitude de Volley Demande qui a très bien fonctionné à l'aide de ces paramètres, de sorte que ne devrait pas en être la cause.
Je suppose que le problème, c'est que la demande n'est jamais réellement exécuté, et c'est pourquoi la réponse des auditeurs ne sont jamais atteints. Aussi essayé requestQueue.start()
, mais n'a pas changer une chose.
J'espère que j'ai expliqué mon problème assez bien,
Merci à l'avance!
- Pourquoi essayez-vous d'utiliser RequestFuture? Pouvez-vous partager vos cas d'utilisation?
- Bien problème j'ai été confronté, c'est que j'ai trois demandes et le dernier de ces trois s'appuie sur la réponse des deux premières demandes. J'ai déjà essayé à l'aide de différents RequestQueues, mais il est toujours construit de toutes les demandes avant de les commencer en fait. Donc, je n'ai jamais eu de stocker les valeurs des deux premiers afin que je puisse les utiliser dans la dernière demande. Ma solution pour le moment est en utilisant des écouteurs d'événement à réagir sur les réponses de chaque demande et de commencer une nouvelle une fois que la précédente est terminée.
- Mais vous avez déjà 2 écouteurs pour votre Volley demandes: le succès de l'écouteur et l'erreur de l'auditeur. Vous pouvez aller vous chercher résultat(s) dans la réussite à l'écoute (et peut-être mettre quelque valeur personnalisée dans votre erreur auditeurs - selon vos besoins) et il suffit de lancer votre demande subséquente à partir de là, la réussite et/ou d'erreur d'auditeurs. De cette façon, vos demandes sont synchrones et vous n'avez pas à déranger la mise en œuvre de RequestFuture.
- ok, je vais les utiliser. J'ai juste pensé à l'aide de RequestFuture serait le mieux/plus propre approche, mais il ne fonctionne pas correctement, comme il semble. Merci beaucoup!
- Je souhaite que quelqu'un avait été en mesure de répondre à cette question. Je vais avoir le même problème. Soupir.
- Voir @Blundell, en réponse à une question similaire.
Vous devez vous connecter pour publier un commentaire.
L'ajout d'un délai d'attente de la méthode get va donner la capacité de capture de l'erreur, si aucun délai n'est donné, alors il envoie l'erreur au thread principal. Par conséquent, la modification
JSONObject response = future.get();
avecJSONObject response = future.get(REQUEST_TIMEOUT, TimeUnit.SECONDS);
devrait faire l'affaire et de l'envelopper dans un try catch pour le délaiRésolu!
JSONObject réponse = avenir.get();
Toujours exécuter à l'Avenir la Demande dans le sujet séparé. Il ne fonctionnera pas dans le thread principal. Je suis en cours d'exécution Future Demande d'Appel dans un IntentService et sa fonctionne parfaitement bien.
Heureux De Codage 🙂
Vous devez appeler
future.get()
dans un autre thread. Essayez en l'enveloppant dans une AsyncTask.À la recherche à la source, il ressemble à
RequestQueue
coup d'envoi d'une longue chaîne d'appels à la charge de la réponse, et qui à la fin, dansRequestFuture.onResponse
(qui à son tour appellenotifyAll
à informer le fil de cesser d'attendre, comme vous l'avez mentionné). Je pense que le problème est quewait(0)
et laRequestQueue
chaîne d'exécuter dans le thread de l'INTERFACE utilisateur, de sorte que lorsquewait(0)
est appelée, leRequestQueue
de la chaîne attend également, donconResponse
n'est jamais appelée, ce qui est pourquoi cette ligne se bloque (en raison d'attente(0) attend toujours).En plus de Blair et Farhan solutions, en joignant une relance de la politique de la demande a également fait le travail.