Изменить сообщение диалога при использовании AsyncTask? - PullRequest
1 голос
/ 01 ноября 2011

Я посмотрел на несколько других вопросов, касающихся аналогичной проблемы, и понял, что мне нужно использовать метод onProgressUpdate, чтобы изменить сообщение ProgressDialog.

Например, у меня есть такой код, который выполняется в AsyncTask doInBackGround (это очень маленький пример):

        byte[] data = getBytesFromFile(image);

        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        pictures.dia.setProgress(30);
        pictures.dia.setMessage("Data beginning upload sequence...");

        URL connectURL = new URL(this.base_url);
        HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection();
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");

        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Content-Type", "multipart/form-data, boundary=" + boundary);

        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
        pictures.dia.setProgress(40);
        pictures.dia.setMessage("Output Stream prepared...");

Когда я запускаю таким образом, Я получаю сообщение об ошибке Leaky Window, в котором говорится, что я не могу изменить сообщение dia за пределами AsyncTask.

Так что мой вопрос: как мне использовать onProgressUpdate, чтобы установить сообщение dia когда прогресс dia достигает определенного числа?(то есть, когда dia progress = 30, заставьте его сказать «Последовательность выгрузки данных ...»)
onProgressUpdate, очевидно, всегда должен проверять прогресс dia (как и слушатель, я полагаю,) [если это еще не сделано, как я могу заставить это сделать это?]

Ответы [ 2 ]

5 голосов
/ 01 ноября 2011

Вам необходимо реализовать метод onProgressUpdate для AsyncTask. Создайте новый класс, который будет содержать процент выполнения и сообщение только для того, чтобы быть единственным параметром метода onProgressUpdate.

В onProgressUpdate вызовите dia.setProgress и dia.setMessage.

В вашем методе doInBackground вызовите publishProgress с экземпляром вашего нового класса, который содержит новый процент и сообщение. Это заставит AsyncTask вызвать onProgressUpdate в главном потоке.

Например:

private static class TaskProgress {
    final int percentage;
    final String message;

    TaskProgress(int percentage, String message) {
        this.percentage = percentage;
        this.message = message;
    }
}

В вашей AsyncTask (замените? S на правильные типы для вашей реализации):

public ProgressAsyncTask extends AsyncTask<?, TaskProgress, ?> {

    public void onProgressUpdate(TaskProgress progress) {
         pictures.dia.setProgress(progress.percentage);
         pictures.dia.setMessage(progress.message);
    }

    public ? doInBackground(?... params) {
        // ... your code       
        publishProgress(new TaskProgress(30, "A new update"));
        // ... your code 
    }

}
1 голос
/ 01 ноября 2011

Вы правы в том, что вы должны поместить код для обновления представлений в dia в методе onProgressUpdate.Чтобы убедиться, что onProgressUpdate вызывается, вам нужно сделать вызовы publishProgress.По сути, вы вызываете publishProgress из фонового потока, а затем система через некоторое неопределенное время в будущем вызовет onProgressUpdate в потоке пользовательского интерфейса.

...