android 子线程更新listview,android-在单独的线程中填充listview
在一个活动中,我加载了一个列表视图的行,这花了很多时间,因此我将此任务放在一个单独的线程中以允许显示progressDialog.我做以下private void doMyStuff() {listItems.clear();progressDialog.show();new Thread(new Runnable() {@Overridepublic void run() {for () {li
在一个活动中,我加载了一个列表视图的行,这花了很多时间,因此我将此任务放在一个单独的线程中以允许显示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中运行的…
非常感谢您的所有回答.
更多推荐
所有评论(0)