Элегантное решение? - PullRequest
       1

Элегантное решение?

0 голосов
/ 25 октября 2010

Элегантное решение

Эй, люди.В настоящее время я работаю над проектом, и я думаю о элегантном решении для реализации, я устал от импровизированных решений.

Позвольте мне попытаться объяснить вам мою «проблему»:

Задача этой части моего приложения довольно проста:

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

Загрузчик и обрабатывающий материал - это подкласс AsyncTask, который вызывается в классе, отличном от основного Activity.Но теперь моя проблема:

Где позвонить в Progressdialog?И как GUI-поток может "реагировать" с ProgressDialog?Должен ли я вызвать ProgressDialog из класса обработки или лучше «заблокировать» основной класс, ожидая уведомления?

Приветствия

EnflamedSoul

Ответы [ 2 ]

2 голосов
/ 25 октября 2010

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

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
    protected Long doInBackground(URL... urls) {
    int count = urls.length;
    long totalSize = 0;
    for (int i = 0; i < count; i++) {
        totalSize += Downloader.downloadFile(urls[i]);
        publishProgress((int) ((i / (float) count) * 100));
    }
    return totalSize;
    }

    protected void onProgressUpdate(Integer... progress) {
        setProgressPercent(progress[0]);
    }

    protected void onPostExecute(Long result) {
        showDialog("Downloaded " + result + " bytes");
    }
}

Этот пример взят из официальной документации Android SDK . Преимущество использования publishProgress заключается в том, что вы можете передавать более одного значения в зависимости от количества аргументов, переданных в doInBackground (то есть, если вы загружаете более 1 файла).

0 голосов
/ 25 октября 2010

Определите ваш диалог progess как глобальную переменную.

ProgressDialog pd;

Где вы собираетесь запустить asyncTask:

showYourProgressDialog;
thread = new aThread().execute();

В вашем классе:

public class aThread extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... args) {
            try {
                //Do your downloading and stuff
                                asyncHandler.sendMessage(asyncHandler.obtainMessage(0));
            } catch (Exception e) {
                Log.e("1", "Error", e);
            }
            return null;
        }
    }

Handler asyncHandler = new Handler() {
        public void handleMessage(Message msg) {
            pd.dismiss();
            if (msg.what == 0) {
                //update what you need to               
            }           
        }
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...