【问题标题】:Wait for retrofit asynchronous call response on an adapter?等待适配器上的改造异步调用响应?
【发布时间】:2017-11-29 13:08:00
【问题描述】:

我需要在适配器中创建一个 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 的依赖项)。
请记住,我是初学者,所以尽量做到准确。

【问题讨论】:

    标签: java android asynchronous android-asynctask retrofit2


    【解决方案1】:

    为了等待改造,请将您的适配器完全加载到 onResponse 中。

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

    另外,这是正确设置适配器内容的方法。您不想取消引用适配器的列表对象

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

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

    【讨论】:

    • 如何在 onResponse 中制作整个适配器?因为适配器应该是一个完整的类吧?
    • 定义一个类和实例化一个new一个是有区别的
    【解决方案2】:

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

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

    创建一个接口,命名为OnOfertasResponse

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

    'ofertas' 方法将在您获得服务器的响应时执行。这称为回调

    现在修改 'checkguardadas' 方法,使其接受回调,并在 onResponse 中执行 'ofertas' 方法

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

    所以要使用它,您只需将回调发送到 'checkguardadas' 方法

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

    【讨论】:

      猜你喜欢
      • 2021-11-24
      • 2011-09-03
      • 2016-02-14
      • 2020-12-03
      • 2020-09-26
      • 2020-12-09
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多