Да плохо тут то, что вы отводите начинающих разработчиков от стандартов. onPreExecute() предназначен для выполнения операций связанных с UI до начала выполнения Async Task, а onProgressUpdate() для отображения прогресса выполнения.
Суть статьи — работа с потоками и понимание в каких методах AsyncTask можно использовать UI поток, а в каких нет. В данном случае я могу вообще всякие крутяшки убрать, потому что это лишнее, также хочу добавить, что стандартный протокол диалогов в Android это не панацея, хоть и удобная и хорошая практика.
Ну зачем вы спорите? Вы пишите для начинающих, значит нужно придерживаться стандартов от Google. Если ваша основная цель показать «в каких методах AsyncTask можно использовать UI поток», то про onPreExecute забывать нельзя. Применение аннотаций в таком примере тоже спорно, даже если они вам очень-очень нравятся, т.к. читатели не смогут просто скопировать ваш код в редактор.
Цель замечаний от всех — помочь вам в будущем писать более качественные статьи, поэтому воспринимать критику в штыки не надо. Удачи )
Не, ну ведь это затрудняет понимание логики автора кода. Если вам нужна только «крутяшка», логично засунуть её в onPreExecute(). publishProgress() для других целей предназначен.
С одной стороны вы пишите, что статья для новичков, а сдругой зачем то:
> Да, я снова применил библиотеку android-annotations, так что не пугайтесь аннотациям.
Вот это совершенно не нужно, было делать. Мало того то пользователи не смогут проверить у себя ваш код, так еще эти анотации не используются ни где кроме подделок.
Вопрос по аннотациям:
@ViewById
Button runButt;
@Click(R.id.runButt)
void runClick(){
new DownloadImageTask().execute(pictUrl);
}
Это значит что кнопку будут два раза по иерархии объектов искать?
По аннотациям: тут нужно почитать доку, либо исходники либы, вполне вероятно, что Вы правы. Но в данном случае, я лишь хотел показать, что к аннотациям можно добавлять идентификаторы(если их не указывать, то либа будет искать вьюшку по названию переменной). Как в первом случае.
А что будет в такой ситуации: запускаем долгий AsyncTask, который получает данные из сети (например картинку) и устанавливает её в ImageView. Во время загрузки переходим на другую activity (например home). После этого наша активити уже не foreground. Что будет происходить с тредом, порождённым AsyncTask'ом (остановится ли он как-то или нет)?.. Установится ли картинка в ImageView или вообще какой то эксепшн вылетит? Давно хотел попробовать, но руки как-то не доходили.
Интересный момент, который легко может возникнуть и у пользователя.
По интуиции: эксепшена может и не быть, но картинка установится и когда вернется снова в данной активити юзер, то он не увидит ее. Загрузка то у нас в фоновом процессе.
Если активити не в foregroгnd, для неё вполне может вызваться onDestroy. Что тогда будет после этого с кодом в AsyncTask, который выставляет в загруженный bitmap в ImageView. Интересно, в этом случае не вызовится onDestroy, прекратится AsyncTask или вылетит эксепшн?
Если приложение разрушится, то возможно и вылетит, ну а так то главный поток(UI-поток) останется работающим если активити было несколько. Но все этого догадки, проверьте на практике и расскажите что получилось. Будет полезно.
Кстати, в версиях до Honeycomb в главном потоке только не рекомендовалось делать «networking». В новых же версиях android'a политика ужесточилась и при попытке выполнить HttpClient execute бросится NetworkOnMainThreadException.
Еще на официальном сайте есть небольшая статья с советами, как избежать ANR (Application Not Responding).
Почему-то никто не упомянул про получение результата через get(). Однажды с этим столкнулся, это блокировало основной поток. Не делайте так, найдите любой другой способ передать результат, но не через этот зловещий метод ;)
Процессы и потоки в Android: пишем AsyncTask правильно