如何返回改造时使用的方法OnResponse的列表?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何返回改造时使用的方法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");
        }

    });

}

但是,在调用clientPost3方法之后,returnedList2为空后变为空。

我该怎么做才能获得在onResponse里面的listList列表?

答案

试试这个,

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

        });

    }
另一答案

你可以这样使用

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

});

}
另一答案

或者像这样的rxJava:

service.postClient(nome)
    .subscribeOn(Schedulers.io())
    .observeOn(androidSchedulers.mainThread())
    .subscribe(response -> returnedList2.addAll(response.getClientResponse()),throwable -> Log.e(TAG, "FAIL"))
另一答案

您的ClientResponse字段必须在服务器响应中命名或标记为@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

那么您的回复将被正确解析。

其他问题可能是你在call.enqueue之后检查你的list2,但Retrofit工作异步,更好的方式使用它是一些回调接口,如:

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

在您的活动,片段或您需要的地方实现此界面。然后将MyInterface引用传递给您调用的类,并在onResponse方法中使用myInterfaceInstanse.onSuccess(response.body());并在onSuccess实现中继续使用此响应。

对不起,对于这样一个困惑的答案,希望你理解我:)

以上是关于如何返回改造时使用的方法OnResponse的列表?的主要内容,如果未能解决你的问题,请参考以下文章

尝试通过列表视图显示数据时应用程序崩溃

JSON onResponse - 列表不会填充数据

Volley Post 请求在 onResponse 内没有返回响应

在我尝试显示结果后启动改造 API 调用

如何将改造 JSON 响应转换为列表?

自定义呼叫适配器改造中的通用类型