2017-08-11 1 views
0

Je suis en train de faire comme ça ...Comment renvoyer une liste sur la méthode OnResponse utilisée sur la retrofit?

public final List<ClientResponse> returnedList2 = new ArrayList<>(); 
    clientPost3(nome, returnedList2); 

Et puis en appelant la méthode clientPost3 qui est ci-dessous:

public void clientPost3(String nome, final List<ClientResponse> returnedList) { 

    Retrofit retrofit = new Retrofit.Builder() 
      .addConverterFactory(GsonConverterFactory.create()) 
      .baseUrl(SERVER_URL) 
      .build(); 

    final Interface service = retrofit.create(Interface.class); 

    Call<List<ClientResponse>> call = service.postClient(nome); 

    call.enqueue(new Callback<List<ClientResponse>>() { 
     @Override 
     public void onResponse(Call<List<ClientResponse>> call, Response<List<ClientResponse>> response) { 
      for(ClientResponse clientResponse: response.body()){ 
       Log.e(TAG, clientResponse.getCliente()); 
       returnedList.add(clientResponse); 

      } 
      Log.e(TAG, "Success"); 
      Log.e("Teste2", returnedList.toString()); 
     } 

     @Override 
     public void onFailure(Call<List<ClientResponse>> call, Throwable t) { 
      Log.e(TAG, "FAIL"); 
     } 

    }); 

} 

Cependant, returnedList2 est vide devient vide après l'appel de la méthode clientPost3.

Que dois-je faire pour obtenir la liste returnsList qui se trouve dans onResponse?

+0

Vous avez 2 options: 1- déclarer returnedList2 au niveau de la classe, 2- utiliser un rappel ou d'une méthode qui prend la liste et l'utilise – MatPag

+1

La rénovation est asynchrone! Tout code immédiatement après clientPost3 va presque toujours s'exécuter avant onResponse arrive même ... Retour de la liste n'est pas le problème. Le problème consiste à appeler les méthodes dans le bon ordre. –

Répondre

0

essayer cela,

public void clientPost3(String nome, final List<ClientResponse> returnedList) { 

     Retrofit retrofit = new Retrofit.Builder() 
       .addConverterFactory(GsonConverterFactory.create()) 
       .baseUrl(SERVER_URL) 
       .build(); 

     final Interface service = retrofit.create(Interface.class); 

     Call<List<ClientResponse>> call = service.postClient(nome); 

     call.enqueue(new Callback<List<ClientResponse>>() { 
      @Override 
      public void onResponse(Call<List<ClientResponse>> call, Response<List<ClientResponse>> response) { 
       returnedList2.clear(); 
       returnedList2.addAll(response.body().getClientResponse()); 

      } 

      @Override 
      public void onFailure(Call<List<ClientResponse>> call, Throwable t) { 
       Log.e(TAG, "FAIL"); 
      } 

     }); 

    } 
+0

Pourquoi avez-vous besoin de passer la liste en paramètre? –

0

Vous pouvez utiliser de cette façon

public List<ClientResponse> returnedList2 = new ArrayList<>(); 

public void clientPost3(String nome, final List<ClientResponse> returnedList) { 

Retrofit retrofit = new Retrofit.Builder() 
     .addConverterFactory(GsonConverterFactory.create()) 
     .baseUrl(SERVER_URL) 
     .build(); 

final Interface service = retrofit.create(Interface.class); 

Call<List<ClientResponse>> call = service.postClient(nome); 

call.enqueue(new Callback<List<ClientResponse>>() { 
    @Override 
    public void onResponse(Call<List<ClientResponse>> call, Response<List<ClientResponse>> response) { 
     returnedList2 = response.body(); 
     Log.e(TAG, "Success"); 
     Log.e("Teste2", returnedList.toString()); 
    } 

    @Override 
    public void onFailure(Call<List<ClientResponse>> call, Throwable t) { 
     Log.e(TAG, "FAIL"); 
    } 

}); 

} 
+0

N'utilisez pas '=' dans la réponse. Clear + addAll sont plus corrects –

0

Ou rxJava, quelque chose comme ceci:

service.postClient(nome) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(response -> returnedList2.addAll(response.getClientResponse()),throwable -> Log.e(TAG, "FAIL")) 
+0

Vous supposez que la question a été compilée RxJava? –

+0

Je suppose qu'il pourrait être changé en rxjava – user1209216

0

Vos champs ClientResponse doivent être nommé dans réponse du serveur ou être marqué @SerializedName ("")

Par exemple, votre réponse du serveur est en JSON:

{ 
"time": "15:29", 
"date": "11.08.2017" 
} 

Ensuite, votre classe doivent être comme ça

class MyClass{ 
private String time; 
private String date; 
//getters, setters, stc 
} 

ou

class MyClass{ 
@SerializedName("time") 
private String cerrentTime; 
@SerializedName("date") 
private String currentDate; 
//getters, setters, etc 

alors votre réponse sera analysée correctement.

Autre problème peut être que vous vérifiez votre liste2 après call.enqueue, mais Retrofit travaux asynchrones et une meilleure façon de l'utiliser est avec une interface de rappel comme:

interface MyInterface{ 
void onSuccess(ArrayList<ClientResponse> list); 
} 

implémenter cette interface dans votre activité, ou fragment ou où vous avez besoin. Passez ensuite la référence MyInterface à votre classe où vous appelez et dans votre méthode onResponse, utilisez simplement myInterfaceInstanse.onSuccess(response.body()); et poursuivez votre travail avec cette réponse dans la réalisation onSuccess.

Désolé, pour une telle réponse confuse, espère que vous me comprenez :)