Warten Sie, bis das Ergebnis der Asynchronen Volley Anfrage und senden Sie es
Unten ist eine Methode, bei der ich versucht bin, um eine Benutzer-Objekt durch Aufruf getSelf(). Problem ist, dass das Ergebnis ist immer null, da die Volley-Anfrage noch nicht fertig zum Zeitpunkt der Rückgabe das Ergebnis. Ich bin etwas neu auf asynchrone Prozesse, also bin ich nicht sicher der beste Weg, um die Methode warten auf das Ergebnis des API-Aufrufs der UserBean Objekt. Kann mir jemand etwas Hilfe?
public UserBean getSelf(String url){
RpcJSONObject jsonRequest = new RpcJSONObject("getSelf", new JSONArray());
JsonObjectRequest userRequest = new JsonObjectRequest(Request.Method.POST, url, jsonRequest,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
String result;
try {
result = response.getString("result");
Gson gson = new Gson();
java.lang.reflect.Type listType = new TypeToken<UserBean>() {}.getType();
//HOW DO I RETURN THIS VALUE VIA THE PARENT METHOD??
userBean = (UserBean) gson.fromJson(result, listType);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("Error:", error.toString());
finish();
}
}
);
this.queue.add(userRequest);
return userBean;
}
Sie sollten nicht tun, was Sie zu tun versuchen. Der Grund für die asynchrone Verarbeitung ist so, dass Sie nicht das Programm blockieren oder UI während "langsame" Dinge. So Ihr
Auch überprüfen Sie Ihre Antwort. Könnte es sein
onResponse
sollten, Benachrichtigen Sie den Anrufer, dass das Objekt verfügbar ist, und zeigen Sie es. Wenn Sie den Benutzer zu warten, wirf ein Fortschritts-dialog, und Sie dann zu entlassen, wenn das Ergebnis verfügbar ist.Auch überprüfen Sie Ihre Antwort. Könnte es sein
null
.InformationsquelleAutor chinabean | 2013-10-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für diejenigen, die auf diese Frage aus der Suche & google.
Gibt es keinen Grund zu warten, für eine asynchrone Anforderung zu beenden, da es asynchron ist by design. Wenn Sie erreichen wollen synchrone Verhalten mit Volleyball, Sie haben das so genannte futures:
Beachten Sie, dass Sie zum ausführen der Blockierung von code in einem anderen thread, so wickeln Sie es in
AsyncTask
(sonstfuture.get()
wird immer blockieren).InformationsquelleAutor Max Malysh
Können Sie erreichen dies mit Hilfe der Bibliothek VolleyPlus https://github.com/DWorkS/VolleyPlus
Es hat etwas namens VolleyTickle und RequestTickle. Anforderung ist die gleiche. Es ist der synchrone Anfrage und nur eine Anfrage zur Zeit.
Sie können die Methode verwenden, setShouldCache im Antrag. Übergeben Sie false, um die Methode und es wird keine Zwischenspeicherung der Ergebnisse.
InformationsquelleAutor 1HaKr