从线程内部调用setListAdapter()

时间:2010-06-15 18:31:30

标签: android listactivity listadapter

我的ListActivity有问题,我使用一个线程来显示ProgressDialog,其中获取所有已安装应用程序的列表。我把它变成一个列表适配器,而不是我想设置活动的listadapter,但我不能从线程中做到这一点。

我收到以下错误:ERROR/AndroidRuntime(14429): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

progressDialog = new ProgressDialog(this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setMessage("Loading...");
progressDialog.show();
new Thread() {
        public void run() {
              showList(); // the method where i get all the apps and have the setListAdapter(); method
              progressDialog.dismiss();
        }
}.start();

如何获取它,以便我可以在我的线程中使用setListAdapter

2 个答案:

答案 0 :(得分:2)

最简单的方法是使用Activity的runOnUiThread方法:

runOnUiThread(new Runnable() {
    public void run() {
        showList();
        progressDialog.dismiss();
    }
});

修改:将线程更改为Runnable

答案 1 :(得分:2)

我解决了它,通过使用Handler我设法从线程中获取setListAdapter并仍在等待Thread执行该方法。

final Handler h = new Handler(){
    public void handleMessage(Message msg) {
        setListAdapter(appsAdapter);
    }           
};

new Thread() {
    public void run() {
        showList();
        progressDialog.dismiss();
        h.sendEmptyMessage(0);
    }
}.start();