【问题标题】:Recycler items get loaded after onPostExecute在 onPostExecute 之后加载回收站项目
【发布时间】:2016-11-21 11:03:10
【问题描述】:

我正在使用 AsyncTask 中的 Volley 调用加载数据。并且还进行了编码以显示ProgressDialog。但问题是onPreExecuteonPostExecute 太快以至于ProgressDialog 没有出现,几秒钟后项目仍然不可见

【问题讨论】:

  • 我在 AsyncTask 中使用 Volley 调用加载数据 ...为什么? volley 已经是一个异步库...请学习多线程中的基本流程... 但问题是 onPreExecute 和 onPostExecute 太快以至于没有出现 ProgressDialog ...我很确定您是在调用任何这些方法之前阻止它......让我猜猜:new Task().execute(); dialog.dismiss();doInBackground 中的异步调用
  • 请提供您的代码?
  • 不,我在 onPostExecute 下关闭它

标签: java android


【解决方案1】:

AsyncTask 看起来的执行速度非常快(甚至比您获得请求的结果还要快)的原因可能是通过在 AsyncTask 中使用 Volley,您正在使用 volley 的线程来制作网络请求而不是异步任务线程。

这会使异步任务看起来执行得非常快,而实际上 您只是将工作传递给另一个线程(凌空线程),所以 AsyncTask 结束了它的工作,而您仍然一无所有,然后凌空完成它的工作,你得到结果。

解决方案:

使用 Android volley 或使用 AsyncTask

正如您在volley training docs 中看到的,不需要AsyncTask

还可以查看this SO AsyncTask example,验证由于doInBackgound()在另一个线程中运行,不需要使用volley或其他异步方法

更新以回答 cmets 中的问题:

如何将ProgressDialog 与凌空一起使用?

例如this other SO 帖子中所述,实际上非常简单

你只有两个步骤:

  1. 您在将 Volley 请求添加到队列时开始您的 ProgressDialog ;)

    //将请求加入队列 rq.add(请求);

    //initialize the progress dialog and show it
    progressDialog = new ProgressDialog(getActivity());
    progressDialog.setMessage("Fetching The File....");
    progressDialog.show();
    
  2. 您在 OnResponse() 中关闭对话框

    StringRequest postReq = new StringRequest(Request.Method.POST, "http://httpbin.org/post", new Response.Listener<String>() 
    {
    
        @Override
        public void onResponse(String response) {
            tv.setText(response); // We set the response data in the TextView
            progressDialog.dismiss();
        }
    }, 
    
    new Response.ErrorListener() {
    
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(“Volly Error”,”Error: ”+error.getLocalizedMessage());
                progressDialog.dismiss();
            }
    });
    

【讨论】:

  • 感谢您的回答,现在我想使用 volley call 我没有选择。所以如果我这样做,那么我将如何展示我自己的 ProgressDialog
  • 我正在尝试您的建议,但运行时错误指出 Unable to add window -- token null is not for an application
  • @AkshayDusane 如果没有您的代码,将很难查明错误。但就这样看来,您在实例化 ProgressDialog 时遇到了麻烦,请尝试替换 ::: new ProgressDialog(getActivity); ---->> new ProgressDialog(YOUR_ACTIVITY_NAME.this); 让我知道它是否有效
  • 实际上,我为我的所有 VolleyRequest 创建了一个单独的类,它不扩展任何片段或活动。我也尝试了您对 new ProgressDialog(YOUR_ACTIVITY_NAME.this) 的建议。它说它不是封闭类,解决方法是使类成为静态的。但我想避免这种情况。这是一个正确的方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
相关资源
最近更新 更多