Как внести изменения в пользовательский интерфейс в Android AsyncTask? - PullRequest
9 голосов
/ 29 января 2011

В сценарии, где у меня есть пользовательский интерфейс, который будет обновляться из отдельного потока (используя AsyncTask), я могу определить AsyncTask как внутренний класс действия, но это имеет два недостатка, которые я считаю проблемными:

  1. Это делает исходные файлы очень большими, снижая эффективность управления кодом
  2. Это затрудняет повторное использование класса потока

Какое хорошее решение? Использовать внутренний класс, но абстрагировать все, что он делает с другими классами? Передать ссылку на активность в AsyncTask? Всегда определяйте класс AsyncTask как внутренний класс и просто принимайте, что исходные файлы будут большими?

Ответы [ 3 ]

13 голосов
/ 29 января 2011

Прежде всего: при использовании AsyncTask вы не должны выполнять действия пользовательского интерфейса в пределах doInBackground().

Что вы можете сделать, это - если вы хотите, например, обновить статус для длительной фоновой работы,publishProgress(values) из doInBackground ().Затем среда выполнения для этих значений вызовет ваш обратный вызов onProgressUpdate(values), который выполняется в потоке пользовательского интерфейса и из которого вы можете обновить пользовательский интерфейс.

Посмотрите, например, https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/TweetListActivity.java#L336, чтобы увидеть пример.

AsyncTask может быть реализован в собственном файле класса.

2 голосов
/ 29 января 2011

Довольно много примеров, которые я видел, просто передают Context в конструктор AsyncTask.

public class BackgroundStuff extends AsyncTask<Void, Void, Void> {
    ...
    Context mContext;
    ...
    BackgroundStuff(Context context){
        super();
        this.mContext = context;
    }
    ...
}

Мне было бы интересно узнать, использует ли кто-нибудь еще какие-либо другие подходы.

0 голосов
/ 19 апреля 2011

У меня несколько странный POV с AsyncTasks, потому что я обычно предпочитаю использовать обычные потоки, но, по сути, способ выполнения фоновой задачи и обновления пользовательского интерфейса заключается в создании обработчика в конце метода onCreate () переопределить метод handleMessage (Message msg).

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

Теперь я представляю, что AsyncTasks выполняет аналогичную задачу, но устраняет необходимость реализации переопределения метода handleMessage обработчиков.

Было бы интересно узнать больше о любых преимуществах / недостатках между этими двумя подходами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...