Вебинар 3. Внутренний мир Android: AsyncTask

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение KamiSempai » 21 окт 2013, 14:39

Внутренний мир Android: AsyncTask.

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

В качестве первого объекта для вскрытия был выбран AsyncTask. Это сравнительно не большой класс, и я думаю, мы уложимся меньше чем за час.
В процессе мы разберем принципы его работы, а также некоторые тонкости при его использовании.

Для успешного понимания материала потребуется знать:
1) Все про AsyncTask http://startandroid.ru/ru/uroki/vse-uro ... rimer.html
2) Что такое generic http://www.rsdn.ru/article/java/genericsinjava.xml
3) Не быть чурбаном в понимании работы потоков;
4) и еще, хотя бы знать, для чего он нужна синхронизация https://www.google.ru/search?q=java+syn ... 2&ie=UTF-8

Вебинар будет проводиться в воскресение 27 Октября в 18:00 по Москве. Так что в субботу много не пейте :)
(в случае непредвиденных ситуаций, дата и время могут быть перенесены)

Что необходимо для посещения вебинара? Перейти по ссылке http://www.justin.tv/ridteam и ввести пароль ridteam для доступа к каналу. Что бы писать в чат рекомендуем пройти регистрацию на сайте http://www.justin.tv/user/signup
Если возникли какие либо проблемы или неполадки с просмотром/регистрацией к вебинару - пишите нам на info@ridteam.com
Удачного просмотра!

Так же если вы хотите быть всегда в курсе наших новостей то подписывайтесь на рассылку.

UPD: Вебинар завершен, ссылка на видео на YouTube: ЖМИ СЮДА!

Исходные тексты программ используемых в вебинаре:
Первый вариант AsyncTimer[syntax=java]private class AsyncTimer extends AsyncTask<Integer, Integer, Void> {
private TextView mTextView;

public AsyncTimer(TextView textView) {
super();
mTextView = textView;
}

@Override
protected Void doInBackground(Integer... params) {
for(int i = params[0]; i >= 0 ;i--){
publishProgress(i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}

@Override
protected void onProgressUpdate(Integer... values) {
mTextView.setText(“Timer: “ + values[0].toString());
}

@Override
protected void onPostExecute(Void result) {
mTextView.setText("Timer: Done!");
}
}[/syntax]
onCreate активности[syntax=java] public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

TextView text = new TextView(this);
text.setText("Test text");
setContentView(text);

AsyncTimer timer = new AsyncTimer(text);
timer.execute(10);
}[/syntax]
Измененный AsyncTimer[syntax=java] private class AsyncTimer extends AsyncTask<Integer, Integer, Void> {
private static int TasksCount = 0;
private TextView mTextView;
private final int mTaskId;

public AsyncTimer(TextView textView) {
super();
TasksCount ++;
mTaskId = TasksCount ;
mTextView = textView;
mTextView.setText(getTimerName() + “:Pending…”);
}

@Override
protected Void doInBackground(Integer... params) {
for(int i = params[0]; i >= 0 ;i--){
publishProgress(i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
return null;
}

@Override
protected void onProgressUpdate(Integer... values) {
mTextView.setText(getTimerName() + " Time:" + values[0].toString());
}

@Override
protected void onPostExecute(Void result) {
mTextView.setText(getTimerName() + ": Done!");
}

private String getTimerName() {
return “Timer(“ + mTaskId + “)”;
}
}[/syntax]
Измененный onCreate активности[syntax=java] private static final int TIMERS_COUNT = 5;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout);

for(int i = 0; i < TIMERS_COUNT; i++) {
TextView text = new TextView(this);
text.setText("Test text");
layout.addView(text);

AsyncTimer timer = new AsyncTimer(text);
timer.execute(10);
}
}[/syntax]
Оператор увеличения размера пула[syntax=java]((ThreadPoolExecutor) AsyncTask.THREAD_POOL_EXECUTOR).setCorePoolSize(TIMERS_COUNT);[/syntax]
Пример использования FutureTask[syntax=java]FutureTask<Configuration> config= new FutureTask<Configuration>(new Callable<Configuration>() {
@Override
public Configuration call() throws Exception {
Configuration result = null;

//Загрузка конфигурации...

return result;
}
}) {
public void done() {
// Загрузка закончена...
}
};
new Thread(config).start();[/syntax]
Пример выполнения асинхронного кода без AsyncTask[syntax=java]Thread thread = new Thread() {
public void run() {
// Тут основной код
// .......

runOnUiThread(new Runnable() {
@Override
public void run() {
// Тут что-то, что выполняется в основном потоке
}
});
};
};
thread.start();[/syntax]
Последний раз редактировалось KamiSempai 28 окт 2013, 22:09, всего редактировалось 3 раза.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение Finch » 22 окт 2013, 00:44

Буду смотреть обязательно)
CEO of a company R.id.team

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение rezak90 » 22 окт 2013, 14:57

Finch писал(а):Буду смотреть обязательно)
а поучавствовать уже всё?
R.id.team
Политика на форуме запрещена

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение KamiSempai » 24 окт 2013, 12:30

Определилось точное время: 18:00 по Москве.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение KamiSempai » 28 окт 2013, 22:13

UPD:
1) Добавил ссылку на видео http://www.youtube.com/watch?v=O_ouu4ReCc8
2) Добавил тексты программ, используемых в вебинаре.

Хотелось бы услышать мнение. Стоит ли продолжать или может сделать какие-то изменения в будущем?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

lavan
Сообщения: 27
Зарегистрирован: 27 ноя 2012, 20:25

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение lavan » 29 окт 2013, 12:10

Здравствуйте! Прежде всего хочу поблагодарить вас за ваш труд!
Вы бы не могли сделать ветку верхнего уровня и писать в ней приблизительную дату след вебинара,чтобы можно было её отслеживать. Или если имеется такая возможность, отсылать всем подписчикам дату вебинара на почту. Думаю,что ни один я, хотел бы участвовать но пропускаю из-за незнания даты проведения!

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение rezak90 » 29 окт 2013, 12:16

lavan писал(а):Здравствуйте! Прежде всего хочу поблагодарить вас за ваш труд!
Вы бы не могли сделать ветку верхнего уровня и писать в ней приблизительную дату след вебинара,чтобы можно было её отслеживать. Или если имеется такая возможность, отсылать всем подписчикам дату вебинара на почту. Думаю,что ни один я, хотел бы участвовать но пропускаю из-за незнания даты проведения!
у нас есть подписка если вы на неё подписаны то будете получать от нас самые свежие новости (хоть мы иногда и с запозданием это делаем).
R.id.team
Политика на форуме запрещена

lavan
Сообщения: 27
Зарегистрирован: 27 ноя 2012, 20:25

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение lavan » 29 окт 2013, 12:38

Спасибо,подписался!

lavan
Сообщения: 27
Зарегистрирован: 27 ноя 2012, 20:25

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение lavan » 30 окт 2013, 13:08

Здравствуйте! Посмотрел урок возникло пару вопросов.
1) я так понимаю,что serialexecutor- это не стандартный класс java или android, а свободная реализация работы с Executor? Если да,то какую реализацию использует android|java?
2) в доках не советуют изменять дефолтное поведение executor http://developer.android.com/intl/ru/re ... rams...%29

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение KamiSempai » 30 окт 2013, 14:02

lavan писал(а):Здравствуйте! Посмотрел урок возникло пару вопросов.
1) я так понимаю,что serialexecutor- это не стандартный класс java или android, а свободная реализация работы с Executor? Если да,то какую реализацию использует android|java?
SerialExecutor - это внутренний класс AsyncTask-а.
lavan писал(а):2) в доках не советуют изменять дефолтное поведение executor http://developer.android.com/intl/ru/re ... rams...%29
Не заметил такого. Там пишут лишь о том, что пока нам не понадобится параллельно выполнение тасков, да так, что даже спать не можешь без этого, лучше использовать стандартный executor.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

lavan
Сообщения: 27
Зарегистрирован: 27 ноя 2012, 20:25

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение lavan » 30 окт 2013, 17:38

ну в общем, да, не советуют, а предупреждают:
Starting HONEYCOMB, tasks are back to being executed on a single thread to avoid common application errors caused by parallel execution. If you truly want parallel execution, you can use the executeOnExecutor(Executor, Params...) version of this method with THREAD_POOL_EXECUTOR; however, see commentary there for warnings on its use.

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение trew » 05 ноя 2013, 11:20

Я новичок в java. Честно посмотрел темы: потоки и дженерики, в интернете (подготовился к просмотру).
Но этого не хватило, чтобы осилить первую часть видео-ролика. Постоянное перескакивание с одной части кода на другую.
Наверно, докладчику нужно было заранее нарисовать схему, до вебинара. Рассказать по схеме, а потом показать это в коде.
В ролике другая последовательность подачи материала: вначале код, затем схема. От сложного к простому.

Во второй части хоть пример привели, 5 потоков, затем 15 потоков. Здесь, в общем, понятно.

Чего не хватает: готовых примеров, в которые можно подставлять свои данные. Желательно без " ... ", потому что не всегда удается заполнить его.

Что меня порадовало: на 41.10 написали config.get(); я посмеялся что этот код не поместили в блок try-catch.
Но на 41.40 этот код уже был помещен в этот блок :)

Пожелания:
1) первое сообщение этой темы. когда будет семинар - эта информация уже устарела, почему не отредактировать сообщение?
2) обычно школьникам и студентам изучающим html преподаватели говорят - никогда не делайте ссылки красным, зеленым, желтым и т.д.
в интернете пользователи уже привыкли что ссылка - синего цвета и подчеркнута.
я искал ссылку на ролик 10-15 сек :) в первом сообщении.
3) звук после записи ролика нужно было обработать. Инну очень громко слышно, Денис говорит тише. В наушниках - это бьет по ушам.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение Foenix » 05 ноя 2013, 12:19

да, со звуком ужас, конечно. Я прошу прощения.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение KamiSempai » 13 ноя 2013, 13:22

trew, спасибо за отзыв. Это именно то, что я хотел увидеть. Мы обязательно учтем это в следующих вебинарах.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
knight
Сообщения: 44
Зарегистрирован: 21 сен 2012, 09:25

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение knight » 19 дек 2013, 09:54

Добрый день, этот вебинар мне очень помог. в своем проекте в некторых местах я использовал такие потоки, позже модифицировал их до THREAD_POOL_EXECUTOR, и вот тут я попал на то что экзекутор этот есть только с апи 11, соответственно я заляпал пока проверкой на апи лвл, вопрос в следующем нет никакой библиотеки типа как шерлока для Ансик потоков?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение KamiSempai » 19 дек 2013, 11:45

Если вам критично выполнение в ThreadPoolExecutor, можно соорудить что-то на подобии такого класса:

[syntax=java] public abstract class ThreadPoolAsynchTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
public ThreadPoolAsynchTask<Params, Progress, Result> executeOnThreadPool(Params... params) {
if(android.os.Build.VERSION.SDK_INT < 11) execute(params);
else executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
return this;
}
}[/syntax]
Тогда, при вызове executeOnThreadPool, AsyncTask будет выполняться при помощи пула потоков.
Однако есть одно ограничение, для API < 11 вы не сможете поставить количество потоков больше 5.
Если все-же вам необходимо наличие большего количества потоков, я бы посоветовал подумать об пересмотре структуры программы, возможно большую часть AsyncTask-ов можно объединить в одну общую группу и обрабатывать данные этой группы в одном потоке. Я бы мог более подробно сказать как это можно сделать, если вы мне расскажете как вы используете AsyncTask.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
knight
Сообщения: 44
Зарегистрирован: 21 сен 2012, 09:25

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение knight » 19 дек 2013, 16:54

спасибо это я так и сделал, а вот как я понял работает AsyncTask без пула только по очереди как в уроке, с помощью пула расширяется до 5 а дальше мы можем расширить до 128 если не ошибаюсь. мне 5 их вполне хватит но без них не обойтись как без пула сделать 5? ниже 11 пул вообще отсутствует

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение KamiSempai » 19 дек 2013, 22:25

До 11 API использовался пул. По этому, приведенный мною пример, всегда будет использовать пул.
Это уже только после 11 API начали использовать SerialExecutor.

Однако в более поздних версия AsyncTask THREAD_POOL_EXECUTOR объявлен как private и к нему нельзя получить доступ, а следовательно и размер не увеличить.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
knight
Сообщения: 44
Зарегистрирован: 21 сен 2012, 09:25

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение knight » 20 дек 2013, 09:31

а понятно, спасибо. поленился заглянуть в исходники ниже 11 API

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Вебинар 3. Внутренний мир Android: AsyncTask

Сообщение rezak90 » 21 апр 2014, 16:05

Посмотрел вебинар. Было кое что полезное. Как работает почти понял. Но вот больше бы инфы про внутренность. Как говорится "тема сисек не раскрыта", так само не до конца раскрыто что такое: Feature, FeatureTask (под конец более менее стало ясно), Callable, Sync (особенно).
R.id.team
Политика на форуме запрещена

Ответить