Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
listview之前的Android进度对话框_Android_Multithreading_Listview_Progressdialog - Fatal编程技术网

listview之前的Android进度对话框

listview之前的Android进度对话框,android,multithreading,listview,progressdialog,Android,Multithreading,Listview,Progressdialog,我试图在显示listview之前执行进度对话框,因为listview上的项目已下载 我之所以得到这个结果,是因为我试图用displayListView()在线程中更改listview 如果我将displayListView()放在线程外,则会得到NullPointerExection。displayListView()使用下载的fieldsListarraylist。 我试图在myThread.isAlive期间等待,但以这种方式progressdialog未显示。 如何修复它 我的代码: @O

我试图在显示listview之前执行进度对话框,因为listview上的项目已下载

我之所以得到这个结果,是因为我试图用displayListView()在线程中更改listview

如果我将displayListView()放在线程外,则会得到NullPointerExection。displayListView()使用下载的fieldsListarraylist。 我试图在myThread.isAlive期间等待,但以这种方式progressdialog未显示。 如何修复它

我的代码:

@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();
}