在一个活动中,我加载了需要很长时间的listview行,因此我将这个任务放在一个单独的线程中以允许显示progressDialog。在单独的线程中填充listview
我做了以下
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程序中所做的。
该错误只出现“有时”,并且在逐步调试时不会出现。
这导致我在网上搜索,我发现了一些与此相关的问题,我必须承认事情并不清楚。
因为我只有在线程完成时才调用notifyDataSetChanged(),为什么它有时会引发异常。
有人可以确认我这种做法是错误的,我必须使用异步任务,也许解释我为什么?
我需要显示一个progressDialog,有人可以给我一个AsyncTask的简单例子,它填充一个listview并显示填充进度的progressDialog。
感谢
UPDATE
jtanveer给我的答案的AsyncTask问题。现在其他人指出,解雇不在处理程序,我纠正。
据对“无痛线程”的jtanveer给出的文章,他们说,
Android提供了几种方法来访问其他线程UI线程它们中的哪一个是处理程序。
有人知道为什么在处理程序中放弃解雇没有解决我的问题?对我来说listItem.add跟UI没有关系?在这一点上我错了吗?
对我来说,在我的代码中唯一的UI是adapter和progressdialog?任何评论或解释是值得欢迎的。
最终答案
stjom给我具体的代码工作的答案。在处理程序中运行runOnUiThread。它的工作,但我很惊讶,因为我认为处理程序运行在Ui线程...
感谢所有你的答案。
我相信这里有很多例子。尝试在网上搜索“android progressdialog asynctask example”之类的东西。 – anon
你现在的答案都是正确的。你不需要使用'AsyncTask',尽管它确实使这样的操作变得干净。你必须做的是UI /主线程上的所有UI操作,这包括关闭进度对话框。你可以使用下面的'AsyncTask'例子,或者只在'Handler'回调中加入'progressDialog.dismiss()'。 – Devunwired
+1给你们俩指出那个错误。不幸的是,它并没有纠正我的问题,但我不明白为什么该处理程序是在UI线程中! – HpTerm