Как я могу создать 2-й поток, иметь прогрессиалог и приостановить основной поток? - PullRequest
0 голосов
/ 23 ноября 2011

Извините, я новичок в программировании Android.У меня есть парсер XML, который я не хочу запускать в потоке пользовательского интерфейса.Я хочу отображать диалоги выполнения, пока анализатор работает в своем собственном потоке, но я не хочу, чтобы основной поток запускал следующее действие до тех пор, пока анализатор не будет завершен.У меня есть код, но ProgressDialog не отображается в течение полной продолжительности.Вместо цикла while я попробовал parserThread.join () с теми же результатами.Кроме того, я хочу избежать таймаута потока пользовательского интерфейса.Любая помощь приветствуется.

Мой метод, который вызывает поток, за которым следует класс, реализующий 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 голосов
/ 23 ноября 2011

Этот код:

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

нужно идти. Пока у вас это есть, вы можете вообще не использовать отдельный поток. (На самом деле, это еще хуже, потому что это « занятое ожидание », которое перегружает процессор.)

Правильный способ сделать это - перезвонить. Когда поток синтаксического анализа завершен, он может вызвать post(Runnable), чтобы запустить процесс в потоке пользовательского интерфейса, который приведет к исчезновению диалога прогресса. Вы можете использовать AsyncTask , чтобы помочь с этим. Дополнительную информацию смотрите в теме руководства Процессы и потоки .

0 голосов
/ 23 ноября 2011

В Android мы используем класс AsyncTask, чтобы фоновые операции отображали результаты. См. Главную страницу документа здесь первый пример кажется вам весьма полезным, просто измените метод doInBackground для вашего анализатора.

...