如何创建第二个线程,具有progressdialog并暂停主线程?

时间:2011-11-23 00:05:17

标签: android multithreading parsing progressdialog

抱歉,我是Android编程新手。我有一个xml解析器,我不想在UI线程中运行。我希望在解析器在其自己的线程中运行时显示progressdialog但我不希望主线程在解析器完成之前启动下一个Activity。我有代码,但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();
    }

2 个答案:

答案 0 :(得分:0)

在android中,我们使用AsyncTask类使后台操作显示结果。请参阅主文档页面here,第一个示例对您来说非常有用,只需更改解析器的doInBackground方法即可。

答案 1 :(得分:0)

此代码:

while (parserThread.isAlive()) {
    // do nothing
}

需要去。只要你拥有它,你可能根本就不使用单独的线程。 (事实上​​,它更糟糕,因为它是一个占用CPU的“busy wait”。)

这样做的正确方法是回拨。解析线程完成后,它可以调用post(Runnable)在UI线程上运行一个进程,使进程对话框消失。您可以使用AsyncTask来帮助解决此问题。有关详细信息,请参阅指南主题Processes and Threads