listview之前的Android进度对话框
我试图在显示listview之前执行进度对话框,因为listview上的项目已下载 我之所以得到这个结果,是因为我试图用displayListView()在线程中更改listview 如果我将displayListView()放在线程外,则会得到NullPointerExection。displayListView()使用下载的fieldsListarraylist。 我试图在myThread.isAlive期间等待,但以这种方式progressdialog未显示。 如何修复它 我的代码:listview之前的Android进度对话框,android,multithreading,listview,progressdialog,Android,Multithreading,Listview,Progressdialog,我试图在显示listview之前执行进度对话框,因为listview上的项目已下载 我之所以得到这个结果,是因为我试图用displayListView()在线程中更改listview 如果我将displayListView()放在线程外,则会得到NullPointerExection。displayListView()使用下载的fieldsListarraylist。 我试图在myThread.isAlive期间等待,但以这种方式progressdialog未显示。 如何修复它 我的代码: @O
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.build_main);
final ProgressDialog dialog = new ProgressDialog(this);
dialog.setCancelable(true);
dialog.setMessage("Loading...");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setProgress(0);
dialog.setMax(100);
dialog.show();
Thread myThread = new Thread(new Runnable() {
public void run() {
Builder builder = new Builder(server, user, password, BuildFieldsViewActivity.this, USER_AGENT);
Document doc = null;
doc = builder.DownloadPage("d.php?ne="+gyv_id);
fieldsList = builder.getKaimas(doc);
displayListView();
dialog.setProgress(100);
dialog.dismiss();
}
});
myThread.start();
}
必须从UI线程更新任何UI元素。您正在从后台线程操作对话框。于是,坠机事件发生了
快速修复方法是使用runOnUiThread(Runnable),在Runnable中,您可以安全地更新任何UI元素。我理解这一点,但如果有办法在线程完成后等待,然后使用fieldsList array with progress对话框生成listview?我可能无法正确理解您的注释。但是您确切地知道线程任务何时在runnable中完成。您可以创建一个私有方法,在该方法中调用runOnUiThread(Runnable)。然后在线程完成任何任务时调用这个私有方法。不知何故,我还没有看到关于runOnUiThread(Runnable)的第二部分答案,它现在可以工作了:)谢谢。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.build_main);
final ProgressDialog dialog = new ProgressDialog(this);
dialog.setCancelable(true);
dialog.setMessage("Loading...");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setProgress(0);
dialog.setMax(100);
dialog.show();
Thread myThread = new Thread(new Runnable() {
public void run() {
Builder builder = new Builder(server, user, password, BuildFieldsViewActivity.this, USER_AGENT);
Document doc = null;
doc = builder.DownloadPage("d.php?ne="+gyv_id);
fieldsList = builder.getKaimas(doc);
displayListView();
dialog.setProgress(100);
dialog.dismiss();
}
});
myThread.start();
}