Страница 1 из 2

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

Добавлено: 21 окт 2013, 14:39
KamiSempai
Внутренний мир 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]

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

Добавлено: 22 окт 2013, 00:44
Finch
Буду смотреть обязательно)

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

Добавлено: 22 окт 2013, 14:57
rezak90
Finch писал(а):Буду смотреть обязательно)
а поучавствовать уже всё?

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

Добавлено: 24 окт 2013, 12:30
KamiSempai
Определилось точное время: 18:00 по Москве.

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

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

Хотелось бы услышать мнение. Стоит ли продолжать или может сделать какие-то изменения в будущем?

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

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

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

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

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

Добавлено: 29 окт 2013, 12:38
lavan
Спасибо,подписался!

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

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

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

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

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

Добавлено: 30 окт 2013, 17:38
lavan
ну в общем, да, не советуют, а предупреждают:
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.

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

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

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

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

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

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

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

Добавлено: 05 ноя 2013, 12:19
Foenix
да, со звуком ужас, конечно. Я прошу прощения.

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

Добавлено: 13 ноя 2013, 13:22
KamiSempai
trew, спасибо за отзыв. Это именно то, что я хотел увидеть. Мы обязательно учтем это в следующих вебинарах.

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

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

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

Добавлено: 19 дек 2013, 11:45
KamiSempai
Если вам критично выполнение в 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.

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

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

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

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

Однако в более поздних версия AsyncTask THREAD_POOL_EXECUTOR объявлен как private и к нему нельзя получить доступ, а следовательно и размер не увеличить.

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

Добавлено: 20 дек 2013, 09:31
knight
а понятно, спасибо. поленился заглянуть в исходники ниже 11 API

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

Добавлено: 21 апр 2014, 16:05
rezak90
Посмотрел вебинар. Было кое что полезное. Как работает почти понял. Но вот больше бы инфы про внутренность. Как говорится "тема сисек не раскрыта", так само не до конца раскрыто что такое: Feature, FeatureTask (под конец более менее стало ясно), Callable, Sync (особенно).