Как стать автором
Обновить

Комментарии 27

НЛО прилетело и опубликовало эту надпись здесь
И еще, что это за дурацкая идея вызывать ProgressDialog с помощью publishProgress()? Чем вам onPreExecute() не угодил?

И почему не инициализировать диалог с помощью onCreateDialog()?
И что тут по вашему дурацкого?
publishProgress просто вызывает onProgressUpdate() в котором крутяшка.
Да плохо тут то, что вы отводите начинающих разработчиков от стандартов. onPreExecute() предназначен для выполнения операций связанных с UI до начала выполнения Async Task, а onProgressUpdate() для отображения прогресса выполнения.

Та же ерунда и с onCreateDialog().
Суть статьи — работа с потоками и понимание в каких методах 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 или вообще какой то эксепшн вылетит? Давно хотел попробовать, но руки как-то не доходили.
при описанной выше реализации все накроется медным тазом даже нa cменe ориентейшнa
Интересный момент, который легко может возникнуть и у пользователя.

По интуиции: эксепшена может и не быть, но картинка установится и когда вернется снова в данной активити юзер, то он не увидит ее. Загрузка то у нас в фоновом процессе.
Если активити не в foregroгnd, для неё вполне может вызваться onDestroy. Что тогда будет после этого с кодом в AsyncTask, который выставляет в загруженный bitmap в ImageView. Интересно, в этом случае не вызовится onDestroy, прекратится AsyncTask или вылетит эксепшн?
Если приложение разрушится, то возможно и вылетит, ну а так то главный поток(UI-поток) останется работающим если активити было несколько. Но все этого догадки, проверьте на практике и расскажите что получилось. Будет полезно.
Кстати, в версиях до Honeycomb в главном потоке только не рекомендовалось делать «networking». В новых же версиях android'a политика ужесточилась и при попытке выполнить HttpClient execute бросится NetworkOnMainThreadException.

Еще на официальном сайте есть небольшая статья с советами, как избежать ANR (Application Not Responding).
> Каждый тег компонента(,, и )

Кажется, теги пропали.
fixed
Почему-то никто не упомянул про получение результата через get(). Однажды с этим столкнулся, это блокировало основной поток. Не делайте так, найдите любой другой способ передать результат, но не через этот зловещий метод ;)
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.