为啥 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 不能正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 AsyncTask 中为另一个类的 ListView 设置适配器?

Nodejs 承诺 async/await 不能正常工作

为啥 ScrollView 不能正常工作?

为啥这个查询不能正常工作?

为啥程序不能正常工作?

为啥模板类不能正常工作双重?