2016-07-28 10 views
1

Ich verwende Retrofit 2.0, um API-Aufrufe mit verschachteln mehrere Anfragen. Alle api funktioniert individuell gut. Aber wenn ich alle Retrofit verschachtelt, führen erste Anforderung perfekt, aber nach, dass, wenn ich zweite Anforderung registrieren ist es nicht in enqueue Methode Rückruf (dh es direkt null Rückkehr ist enqueue's innere Methoden wie onResponse, onFailure ohne Einfügen)Enqueue mehrere GET-Anfrage bei verschachtelten Retrofit 2.0

Mein Code: -

public class Main2Activity extends AppCompatActivity { 
    Gson gson; 
    JSONObject jsonResult=null; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main2); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     gson=new GsonBuilder().create(); 
     firstRequest(); //-- First retrofit request 
    } 


    private void firstRequest() { 
     Retrofit retrofit=new Retrofit.Builder().baseUrl(getResources().getString(R.string.Api_Url)).addConverterFactory(GsonConverterFactory.create(gson)).build(); 
     CityRetailsApi service = retrofit.create(CityRetailsApi.class); 
     Call call_first= service.getMainCatFlag(); 

     call_first.enqueue(new Callback() { 
      @Override 
      public void onResponse(Call call, Response response) {   
       Log.d("MainActivity", "Status Code = " + response.code()); 
       if (response.isSuccessful()){ 
        MainCatFlag result = (MainCatFlag) response.body(); //-- Get First request response      
        JSONObject json2nd = secondRequest(); //-- Second request 
       } 
      } 

      @Override 
      public void onFailure(Call call, Throwable t) { 
       Log.d("MainActivity", "Error"); 
      } 
     }); 
    } 

    private JSONObject secondRequest() { 
     try {    
      Retrofit retrofit=new Retrofit.Builder().baseUrl(getResources().getString(R.string.Api_Url)).addConverterFactory(GsonConverterFactory.create(gson)).build(); 
      CityRetailsApi service = retrofit.create(CityRetailsApi.class); 
      Call call_second= service.getMainCat(); 

      call_second.enqueue(new Callback() { 
       @Override 
       public void onResponse(Call call2, Response response1) {      
        Log.d("MainActivity", "Status Code = " + response1.code()); 
        if (response1.isSuccessful()) {       
         MainCat result = (MainCat) response1.body(); 
         if (result.getSuccess()==1) 
         { 
          try { 
           jsonResult= new JSONObject(new Gson().toJson(result)); 
          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
         } 
        } 
       } 

       @Override 
       public void onFailure(Call call, Throwable t) { 
        Log.d("MainActivity", "Error"); 
       } 
      }); 
     }catch (Exception e){ 
      Log.d("MainActivity", "Error= " + e); 
     } 
     return jsonResult; 
    } 
} 

In obigen Code firstRequest() korrekt ausgeführt und erweist sich aber die Reaktion secondRequest (innen firstRequest() Methode ENQUEUE) nicht gut arbeiten. Kein Fehler, Erfolgsmeldung in der Konsole. Kann mir bitte jemand helfen, dieses Problem zu umgehen.

Wenn irgendein Problem in meinem Code, lass es mich wissen. Vielen Dank im Voraus.

+0

Haben laufen Sie den Debugger, um sicherzustellen, dass response.isSuccessful wahr ist? – Ben

+0

@Ben: Ja, es gibt mir erfolgreich Status und geht auch zu meiner secondRequest() Funktion. Aber mein Problem ist, dass es call_second.enqueue (.....) Methode nicht ausführt. –

+0

Entschuldigung, ich bin ehrlich gesagt ratlos, alles sieht gut zu mir aus. Ich habe ähnlichen Code das einzige, was ich anders mache, ist, dass meine Callbacks keine anonymen inneren Klassen sind, also macht das vielleicht einen Unterschied, obwohl es nicht so sein sollte. – Ben

Antwort

1

Sie haben einen Fehler gemacht, dass, wenn Sie Retrofit enquene verwenden, es asynchron heißt, so dass Sie das Ergebnis nicht außerhalb der Callback-Methode erhalten können!

Also, sollten Sie Ihr Ergebnis in der onResponse Methode wie folgt verarbeiten:

private void secondRequest() { 
    try {    
     call_second.enqueue(new Callback() { 
      @Override 
      public void onResponse(Call call2, Response response1) {      
       Log.d("MainActivity", "Status Code = " + response1.code()); 
       if (response1.isSuccessful()) {       
        MainCat result = (MainCat) response1.body(); 
        if (result.getSuccess()==1) 
        { 
         try { 
          jsonResult= new JSONObject(new Gson().toJson(result)); 

          // process your jsonResult here 
          ... 

         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      } 

      @Override 
      public void onFailure(Call call, Throwable t) { 
       Log.d("MainActivity", "Error"); 
      } 
     }); 
    }catch (Exception e){ 
     Log.d("MainActivity", "Error= " + e); 
    } 
}