等待适配器上的改进异步调用响应?

时间:2017-11-29 13:08:00

标签: java android asynchronous android-asynctask retrofit2

我需要在适配器中创建一个RetrofitCall,这样我就可以像这样在onBindViewHolder中运行一个循环:

public void checkguardadas(int id_usuario) {

    RetrofitService retrofitService = RetrofitService.getInstance();
    PabloAPI api = retrofitService.getApiProxyServer();
     Call<ArrayList<Oferta>> call = api.getGuardadas(1);

     call.enqueue(new Callback<ArrayList<Oferta>>() {
        @Override
        public void onResponse(Call<ArrayList<Oferta>> call, Response<ArrayList<Oferta>> response) {

            Log.d("traza", "por aqui");
            Log.d("traza", response.body().toString());
            guardadas = response.body();


        }

        @Override
        public void onFailure(Call<ArrayList<Oferta>> call, Throwable t) {
            Log.d("traza", "por alla");
            Log.d("traza", t.toString());
        }
    }); 

所以我可以这样称呼:

public void onBindViewHolder(final OfertasAdapter.MyViewHolder viewHolder, 
int i) {
    Iterator it = guardadas.iterator();
    while (it.hasNext()) {
        if (ofertaList.get(i).getId() == guardadas.get(i).getId()) {
            viewHolder.guardar.setChecked(true);
        }
    }

问题是在该代码运行之前没有进行改装调用,因此它会给出空指针异常并且应用程序崩溃。对我能做什么的猜测?我试过几个没有运气的答案(Asynctask和一个名为Rxjava的依赖) 请记住我是初学者,所以尽量保持精确。

2 个答案:

答案 0 :(得分:0)

为了等待Retrofit,请将您的适配器完全加载到onResponse

不要只分配列表内容,实际创建带响应主体的适配器,并将其设置为RecyclerView

此外,这是如何正确设置适配器内容。您不希望取消引用适配器的列表对象

guardadas.clear();
guardadas.addAll(response.body());
adapter.notifyDataSetChanged();

删除while循环。您没有使用it.next(),而您的onBind只应对列表中的一个视图负责

答案 1 :(得分:0)

我在西班牙语StackOverflow中得到了答案:

Retrofit异步执行onResponse方法,因此您需要在onResponse方法获得答案时执行的事件和事件。

创建一个界面,称之为OnOfertasResponse

public interface OnOfertasResponse
{
    void ofertas(ArrayList<Oferta> ofertas);
}

&#39; ofertas&#39;当您获得服务器的响应时,将执行该方法。这称为回调

现在修改&#39; checkguardadas&#39;方法所以它接受回调,并在onResponse中执行&#39; ofertas&#39;方法

public void checkguardadas(int id_usuario, OnOfertasResponse callback) {
    RetrofitService retrofitService = RetrofitService.getInstance();
    PabloAPI api = retrofitService.getApiProxyServer();
    Call<ArrayList<Oferta>> call = api.getGuardadas(1);

    call.enqueue(new Callback<ArrayList<Oferta>>() {
        @Override
        public void onResponse(Call<ArrayList<Oferta>> call, Response<ArrayList<Oferta>> response) {

            Log.d("traza", "por aqui");
            Log.d("traza", response.body().toString());

            // ejecutamos el callback
            callback.ofertas(response.body());
        }

        @Override
        public void onFailure(Call<ArrayList<Oferta>> call, Throwable t) {
            Log.d("traza", "por alla");
            Log.d("traza", t.toString());
        }
    }); 
}

所以要使用它,你只需要将回调发送给&#39; checkguardadas&#39;方法

public void onBindViewHolder(final OfertasAdapter.MyViewHolder viewHolder, int i) {

    // le enviamos el callback al metodo checkguardadas
    checkguardadas(11,new OnOfertasResponse(){

        @Override
        public void ofertas(ArrayList<Oferta> ofertas){
            // este metodo se ejecutara cuando onResponse se ejecute
            Iterator it = ofertas.iterator();
            while (it.hasNext()) {
                if (ofertaList.get(i).getId() == ofertas.get(i).getId()) {
                    viewHolder.guardar.setChecked(true);
                }
            }
        }
    })