为啥 AsyncTask 不能正常工作?
Posted
技术标签:
【中文标题】为啥 AsyncTask 不能正常工作?【英文标题】:Why AsyncTask doesn't work well?为什么 AsyncTask 不能正常工作? 【发布时间】:2016-07-16 02:41:34 【问题描述】:我正在尝试加载 ListView,我希望在加载 ListView 时,会显示一个进度条。
首先,这是我的代码(后面会有结果说明):
class MyTask extends AsyncTask<String,Integer,String>
final ListView listView = (ListView)findViewById(R.id.listView1);
final ProgressBar pb=(ProgressBar)findViewById(R.id.progressBar);
@Override
protected void onPreExecute()
super.onPreExecute();
pb.setVisibility(View.VISIBLE);
listView.setVisibility(View.INVISIBLE);
@Override
protected String doInBackground(String...strings)
populateEventList();
return "done";
@Override
protected void onProgressUpdate(Integer...values)
super.onProgressUpdate(values);
pb.setProgress(values[0]);
pb.setMax(values[1]);
@Override
protected void onPostExecute(String s)
super.onPostExecute(s);
listView.setVisibility(View.VISIBLE);
pb.setVisibility(View.GONE);
结果是进度条随时都没有显示。列表视图已加载,但未显示进度条。
如果我要删除最后一行 pb.setVisibility(View.GONE);
,进度线会显示,但加载 ListView 后它不会消失。
我的代码有什么问题?
【问题讨论】:
访问此链接并查看AsyncTask
的工作原理。 ***.com/questions/18898039/using-asynctask
你怎么称呼你的AsyncTask
?你没有使用.get()
,是吗?
@codeMagic 我这样称呼:new MyTask().execute();
“populateEventList()”在做什么?您可以编辑以显示该方法吗?也许这正在快速执行,所以看起来您的ProgressBar
没有显示。此外,您没有将任何内容传递给 onProgressUpdate()
,因此不会更新这些值。
加载一个列表视图可能不会花费很多时间,除非它有数千个项目,所以它可能显示得如此之快以至于你没有注意到它。您需要调用publishProgress()
来实际更新 ProgressBar 并使其移动。
【参考方案1】:
尝试使用 ProgressDialog 而不是 ProgressBar,这可能会有所帮助:ProgressDialog in AsyncTask。我也遇到了困难,但是一旦我更改为 ProgressDialog,它的配置就相当简单了。否则,我怀疑您调用的方法 populateEventList() 不会花时间。尝试做多种方式,比如把东西放在doInBackGround的线程里面,多线程运行等等。
【讨论】:
您好,感谢您的评论。正如你所说,我正在尝试 ProgressDialog,但我需要一点帮助。如果您不介意查看我的代码,请告诉我需要在onPostExecute()
中输入什么?以上是关于为啥 AsyncTask 不能正常工作?的主要内容,如果未能解决你的问题,请参考以下文章