Как проанализировать XML-файл при приостановке основного выполнения, но не пользовательского интерфейса - PullRequest
2 голосов
/ 18 января 2012

Мне нужно проанализировать XML-файл, который занимает около 3 секунд, и сразу же использовать данные, которые анализируются из XML-файла после его завершения. Однако, поскольку это занимает около 3 секунд, я не хочу, чтобы экран сидел и ждал в течение 3 секунд, ничего не показывая. Я хотел бы, чтобы он отображал ProgressDialog. Я пробовал все в этих темах, и хотя большинство из них делают 2/3, ни один из них не делает все 3.

В основном у меня есть кнопка, при нажатии которой я хочу проанализировать XML-файл, а затем использовать данные, проанализированные из файла:

void onButtonClicked() {

    ProgressDialog pd = new ProgressDialog(this);
    pd.setMessage("Parsing...");
    pd.show();
    String[] ret;
    return = parseXmlFile();
    pd.dismiss();
    if (ret[0] == "steve") {
       sayHiToSteve();
    }
}  

Если я использую asyncTask, он продолжит выполнение и проверит ret [0], прежде чем задача будет завершена, и просто будет нулевым. если я делаю AsyncTask.get (), он приостанавливает выполнение, но не отображает диалог прогресса, так что это тоже не хорошо.

Я также смотрел на создание отдельного потока, но у меня была та же проблема. Я не могу использовать таймер, потому что он составляет около 3 секунд (но может быть до 4 или 5 секунд, если соединение медленное), поэтому я не могу приблизиться.

Любая помощь очень ценится. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 18 января 2012

Вы можете использовать AsyncTask для этого, например:

public class ParseXMLTask extends AsyncTask<Void, Void, String[]>
{

    private ProgressDialog dlg;

    @Override
    protected void onPostExecute(String[] result)
    {
        dlg.dismiss();
        if (result[0] == "steve")
        {
            sayHiToSteve();
        }

        super.onPostExecute(result);
    }

    @Override
    protected void onPreExecute()
    {
        dlg = new ProgressDialog(MyActivity.this);
        dlg.setMessage("Parsing...");
        dlg.setCancelable(false);
        dlg.setIndeterminate(true);
        dlg.show();

        super.onPreExecute();
    }

    @Override
    protected String[] doInBackground(Void... params)
    {
        return parseXmlFile();
    }

}

затем, чтобы использовать его, вы делаете:

void onButtonClicked() 
{
    ParseXMLTask tsk = new ParseXMLTask();
    tsk.execute((Void)null);
}
0 голосов
/ 18 января 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...