【问题标题】:how to wait volley respons to load recyclerview in fragment如何等待凌空响应以在片段中加载recyclerview
【发布时间】:2018-01-29 18:16:56
【问题描述】:

我必须在片段中加载 recycleview。我将通过一个示例来说明我的问题。 在我的 recycleview 中有 20-30 人的联系人。但是他们的电话号码每 30 分钟更改一次。所以当我在底部导航栏中单击联系人按钮(?)时,我必须获取所有最新的电话号码才能加载 recycleview使用正确的电话号码。

我的解决方案是将 adapter.notifyDataSetChanged() 方法放入 OnResponseListener。正如您可以想象的那样,在每个凌空响应中,recycleview 都在更新(在 gui 上看起来真的很糟糕)。

我在互联网上找到的另一个解决方案是使用 AsyncTask。但是 volley 使用自己的线程,所以看起来我们又陷入了死胡同。

【问题讨论】:

  • 您是否尝试过等到所有 volley 请求都完成,然后在获得所有数据后调用 notifyDataSetChanged 以便一次全部更新?
  • 我不知道如何才能等到所有请求都完成。@TomerShemesh

标签: android android-fragments android-recyclerview android-volley


【解决方案1】:

您可以尝试这样的方法,并计算有多少请求正在进行,当您不再有请求时,更新列表。

        int requestsSent = 30;
        requestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext());
        for(int i =0; i < requestsSent; i++)
        {
            mRequestQueue.add(new JsonObjectRequest(Request.Method.GET, "my url", null, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    requestsSent--;
                    if(requestsSent == 0)
                    {
                        notifyDataSetChanged();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    requestsSent--;
                }
            }));
        }

【讨论】:

  • 在此解决方案中,例如 requestsSent = 27 可以在 requestSent= 30 之后执行,因此一个或多个电话号码可能不是最新的。
猜你喜欢
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
相关资源
最近更新 更多