Android 如何创建第二个线程,让progressdialog暂停主线程?

Android 如何创建第二个线程,让progressdialog暂停主线程?,android,multithreading,parsing,progressdialog,Android,Multithreading,Parsing,Progressdialog,对不起,我是Android编程新手。我有一个不想在UI线程中运行的xml解析器。我想在解析器在自己的线程中运行时显示progressdialog,但我不希望主线程在解析器完成之前启动下一个活动。我有代码,但progressdialog不会在整个过程中显示。代替while循环,我尝试了parserThread.join(),得到了相同的结果。另外,我希望避免UI线程超时。感谢您的帮助 调用线程的方法,后面是实现Runnable的类: private void parseGasStationData

对不起,我是Android编程新手。我有一个不想在UI线程中运行的xml解析器。我想在解析器在自己的线程中运行时显示progressdialog,但我不希望主线程在解析器完成之前启动下一个活动。我有代码,但progressdialog不会在整个过程中显示。代替while循环,我尝试了parserThread.join(),得到了相同的结果。另外,我希望避免UI线程超时。感谢您的帮助

调用线程的方法,后面是实现Runnable的类:

private void parseGasStationData() {
        gasStations = null;
        StationParser sp = new StationParser(activity);
        Thread parserThread = new Thread(sp);
        parserThread.start();
        while (parserThread.isAlive()) {
            // do nothing
        }
        gasStations = sp.getList();
        Log.v("Parser-Status", "xml parsed successfully: "
                + (gasStations != null));
    }

public class StationParser implements Runnable {
    private Activity activity;
    private final ProgressDialog pd;

    public StationParser(Activity activity) {
        this.activity = activity;
        pd = ProgressDialog.show(activity, "", "Parsing data...", true, false);
    }

    @Override
    public void run() {
        try {
            runParser();
        } catch (XmlPullParserException e) {
            Log.e("Parser-Error", "XmlPullParserException", e);
            e.printStackTrace();
        } catch (IOException e) {
            Log.e("Parser-Error", "IOException", e);
            e.printStackTrace();
        } catch (ParseException e) {
            Log.e("Parser-Error", "ParseException", e);
            e.printStackTrace();
        }
        pd.dismiss();
    }

在android中,我们使用
AsyncTask
类进行后台操作并显示结果。请参见主文档页面。第一个示例似乎对您非常有用,只需更改解析器的
doInBackground
方法。

此代码:

while (parserThread.isAlive()) {
    // do nothing
}
我得走了。只要你有这样一个线程,你最好不要使用一个单独的线程。(事实上,情况更糟,因为它是一个占用CPU的“”文件。)


正确的方法是回电话。解析线程完成后,它可以调用
post(Runnable)
在UI线程上运行一个进程,该进程将使进度对话框消失。你可以用它来帮我。有关更多信息,请参阅指南主题。

AsyncTask似乎有一个非常模糊的API。我正在尝试,到目前为止,我无法关闭Progressdialog,也不知道如何将arraylist返回到调用类。AsyncTask旨在通过其
onPostExecute
方法传递结果。在这里,您可以关闭“进度”对话框并设置arraylist。您不应该将其视为调用方法并返回结果。您启动一个单独的线程,该线程按照自己的时间表运行,并在工作完成后向主线程报告。主线程的设计需要考虑到这种解耦。主线程应该启动AsyncTask/worker线程,然后将控制权返回操作系统(以避免出现“应用程序无响应”错误)。使用AsyncTask时是否需要一个getter方法返回arrayList?最终,UI线程将启动另一个活动。我不希望解析器在下一个活动中运行。这如何确保解析器在下一个活动开始之前完成?在AsyncTask的
onPostExecute
方法中,可以启动第二个活动,也可以调用主活动的方法,将结果传递给它
onPostExecute
将仅在
doInBackground
方法完成并在UI线程上运行后调用。如果将AsyncTask设置为活动的内部类,则可以从
onPostExecute
中完全访问活动的字段和方法。我让它工作了。我看它有些智慧。它有一个get()方法,确切地知道我想要返回什么。