Android Volley Timeout Ausnahme bei Verwendung von RequestFuture.get ()

8

In meinem Fragment versuche ich, TMDBs offene Film-DB zu verwenden, um Details über "Now Playing" -Filme zu erhalten.

Wenn ich die Methode RequestFuture.get (time, TimeUnit) benutze, um diese Volley-Anfrage auszuführen, erhalte ich immer einen Timeout-Fehler. Wenn ich dieselbe URL in Safari manuell teste, erhalte ich die Ergebnisse sofort.

Was ich weiß:

1.) Es ist kein JSON-Parsing-Fehler (das Programm geht nicht einmal zu den Parsing-Schritten)

2.) Keine Internetprobleme mit AVD. (Grund wird später erklärt).

3.) Kein Problem mit meiner Volley Singleton Klasse oder meiner Request Queue. (Grund später erklärt).

Ich gehe also davon aus, dass ich einen weiteren Fehler bezüglich der Verwendung von Volley / Request Future mache.

Fragment Code unten:

%Vor%

Logcat mit dem Filter für das Tag "RT":

%Vor%

Vor der Verwendung der RequestFuture-Methoden habe ich im Grunde genommen dasselbe gemacht, indem ich meinen eigenen Response.Listener und Response.ErrorListener in meinem Fragment oncreate (anstelle von StepA ();) implementiert habe und es WORKED !!!

Unten ist das Code-Snippet:

%Vor%

Also meine Frage ist, warum funktioniert es nicht, wenn ich die Anfrage zukünftige Methoden implementieren?

Wenn Sie mich fragen, warum ich für die synchrone Volley-Implementierung gehen möchte; Es ist, weil ich danach zwei weitere Volley-Anfragen haben muss, die davon abhängen, dass diese Anfrage vollständig, erfolgreich abgeschlossen ist. Und ich lerne auch:)

    
rapidclock 30.05.2015, 17:33
quelle

2 Antworten

12

Traurig, dass niemand diese Frage beantworten konnte, aber ich konnte dieses Problem wie folgt lösen:

Die Zeitüberschreitung tritt bei RequestFuture.get () ein, wenn sie sich im selben Thread wie der UI-Thread befindet. Ich habe den Mechanismus der Anfrage geändert, so dass die Anfrage in einem separaten Asynch-Thread (nicht UI-Thread) erfolgt und die Antwort auch in einem separaten Thread von der Anfrage wie folgt empfangen wird:

%Vor%

Unten ist der Asynch-Taskcode für die Anfrage:

%Vor%

Ich habe Countdown-Latches hinzugefügt, weil sie großartig sind und weil ich in meinem Programm noch einige weitere Anfragen habe, die von der Antwort dieses Snippets abhängen. Daher helfen sie, das Programm synchroner auszuführen.

    
rapidclock 01.06.2015, 09:31
quelle
0

rapidclocks Antwort ist in Ordnung. Persönlich bevorzuge ich einen IntentService, weil sie so wunderbar sind. Auch Google empfiehlt es: Ссылка

hier ist mein IntentService:

%Vor%

Der Nachteil eines IntentService ist, dass IT (aber nicht der Haupt-UI-Thread) von future.get (...) blockiert wird. (Siehe Kommentar in Code re: future.get Block) Also wenn Sie REST-Aufrufe auf es sprengen dann könnten Sie in Betracht ziehen, immer noch es UND Ihre Anrufe in einem Async wie von ryclockclock umschlungen zu wickeln.

Um den obigen IntentService zu verwenden, setzen Sie dies in die Hauptbenutzeroberfläche (oder wo auch immer):

%Vor%

oh in Ordnung ... hier ist meine Tätigkeit (bitte ding mich nicht für übermäßig detailliert ... Ich liebe Liebe Liebe STACKOVERFLOW aber keine gute Tat geht ungestraft ....):

%Vor%     
JDOaktown 12.04.2017 16:39
quelle