2016-02-25 13 views
5

Ich habe AsyncTask und die DoInBackground-Methode innerhalb der, ich sendende POST-Anfrage mit Retrofit. Mein Code sieht so aus:Retrofit: Wie auf die Antwort warten

//method of AsyncTask 
    protected Boolean doInBackground(Void... params) { 
     Retrofit restAdapter = new Retrofit.Builder() 
       .baseUrl(Constants.ROOT_API_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     IConstructSecureAPI service = restAdapter.create(IConstructSecureAPI.class); 
     //request 
     Call<JsonElement> result = service.getToken("TestUser", "pass", "password"); 
     result.enqueue(new Callback<JsonElement>() { 
      @Override 
      public void onResponse(Call<JsonElement> call, Response<JsonElement> response) { 

      } 

      @Override 
      public void onFailure(Call<JsonElement> call, Throwable t) { 

      } 
     }); 

     return true; 
    } 

Mein Problem ist folgendes: Retrofit Anfrage asynchron Senden und während sie es tun, die doInBackground Methode Wert zurückkehrt. Also muss ich im selben Thread eine Anfrage senden, dass alle Ausführungen in der Reihenfolge sind. Einer nach dem anderen. Die Rückkehr von doInBackground erfolgt, nachdem die Anfrage beendet wurde. Wie kann ich eine Anfrage im selben Thread mit Retrofit senden?

Antwort

7

Die Call Klasse verfügt über eine execute() Methode, die Ihren Anruf synchron macht.

enqueue() ist explizit für einen asynchronen Aufruf.

+0

ja aber wie execute() ist synchron, es scheint auf dem Hauptthread ausgeführt werden. In diesem Fall ist execute() die richtige Antwort, da das Poster bereits an einem Hintergrund-Thread arbeitet und execute() in diesem Thread sein wird. –

0

"Nachsenden Anfrage asynchron" was als @ Tanis.7x erwähnt, Enqueue() macht die asynchrone, also was könnte ein Grund sein, in AsyncTask zu setzen? (async in async?)

Sie können einfach alle Nachrüstcode aus AsyncTask und onResponse ist der Rückruf, der auf Ihre Anfrage Anruf zurück zu sein, so dass Sie alle UI-Update innerhalb dieses Rückrufs tun können.

+0

Ich habe LoginActivity von Android Studio erstellt und den Login-Bereich von TODO für das Senden der Login-Anfrage eingerichtet. Standardmäßig befindet es sich in AsyncTask. Ich möchte nicht viel Zeit für das Umschreiben von Standard-Aktivität Struktur und Logik, so dass ich nur, was Anfrage in der Sequenz innerhalb der DoInBackground – neustart47

+1

woah senden. Ich habe gerade erfahren, dass AS so viel nützlichen Code für LoginActivity generiert! Das ist verrückt. Was Sie ohne Refactoring gesagt haben, macht Sinn, danke @ neustart47! – Emma

Verwandte Themen