在一个活动中,我加载了一个列表视图的行,这花了很多时间,因此我将此任务放在一个单独的线程中以允许显示progressDialog.

我做以下

private void doMyStuff() {

listItems.clear();

progressDialog.show();

new Thread(new Runnable() {

@Override

public void run() {

for () {

listItems.add(something to add);

}

handler.sendEmptyMessage(0);

progressDialog.dismiss();

}

}).start();

}

private Handler handler = new Handler() {

public void handleMessage(android.os.Message msg) {

if (msg.what == 0) {

adapter.notifyDataSetChanged();

}

};

};

我有时有一个引发IllegalStateException的错误.首先,我很惊讶,因为像这样的编程线程通常是我在标准Java程序中所做的.

该错误仅在“有时”出现,并且在逐步调试时不会出现.

这使我可以在网上搜索,因此我在SO中发现了与此相关的一些问题,我必须承认我不清楚这些事情.

当我仅在线程完成时才调用notifyDataSetChanged(),为什么有时会引发异常.

有人可以确认我这种做法是错误的,并且我必须使用异步任务,也许可以向我解释原因?

我需要显示一个progressDialog,有人可以给我一个AsyncTask填充列表视图并显示填充进度的progressDialog的简单示例.

谢谢

UPDATE

jtanveer给了我asynctask问题的答案.现在其他人指出,解雇不在处理程序中,我更正.

根据jtanveer在“无痛线程”上发表的文章,他们说

Android提供了几种从其他线程访问UI线程的方法,其中之一是HANDLER.

有人知道为什么将被解雇的人放在处理程序中不能解决我的问题吗?对我来说listItem.add与UI无关?我在这点上错了吗?

对我来说,在我的代码中,唯一的UI是adapter和progressdialog?欢迎任何评论或解释.

最终答案

stjom为我的特定代码提供了一个可行的答案.在处理程序中运行runOnUiThread.它正在工作,但令我感到惊讶的是,因为我认为处理程序是在Ui Thread中运行的…

非常感谢您的所有回答.

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐