2017-08-11 3 views
0

私はこのようにやろうとしています...更新時に使用されるメソッドOnResponseのリストを返す方法は?

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

そして、ベローズであるメソッドの呼び出しclientPost3:しかし

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"); 
     } 

    }); 

} 

を、returnedList2は空であるメソッドの呼び出し後に空になってきていますclientPost3。

onResponseの中にあるreturnedListを取得するにはどうすればよいですか?

+0

あなたは2つのオプションがあります:クラスレベルでの1-宣言returnedList2、2-使用するコールバックやリストを受け取り、それを – MatPag

+1

使用する方法を改造は非同期です! clientPost3の直後のコードは、onResponseが起きる前にほとんど常に実行されます...リストを返すことは問題ではありません。問題は、正しい順序でメソッドを呼び出すことです。 –

答えて

0

を使用することができます:あなたのClientResponseフィールドはのように命名する必要が

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

なぜパラメータとしてリストを渡す必要がありますか? –

0

あなたは、

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

応答で '='を使用しないでください。 Clear + addAllはより正確です –

0

それともrxJava、このような何かこれを試してみてください。この方法によって

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

RxJavaをコンパイルしたとしますか? –

+0

私はそれがrxjavaに変更できると仮定します – user1209216

0

をサーバーからの応答または@SerializedName( "")とマークされている

たとえば、サーバーからのご回答は、JSONである:

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

次に、あなたのクラスは、この

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

または

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

ようにする必要が、あなたの応答が正しく解析されます。あなたの活動で、このインタフェースを実装

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

、または:

他の問題は、あなたがcall.enqueue後にLIST2をチェックしますが、レトロフィットは非同期に動作し、それを使用するより良い方法は、のようないくつかのコールバックインタフェースであることもあり断片、または必要な場所次に、あなたのクラスにMyInterfaceのリファレンスを渡して、あなたのonResponseメソッドでmyInterfaceInstanse.onSuccess(response.body());を使用し、onSuccessの実現でこのレスポンスを続行します。

申し訳ありませんが、そのような混乱した答えを、あなたは私を理解してほしい:)

関連する問題