Вебинар 3. Внутренний мир Android: AsyncTask
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Вебинар 3. Внутренний мир Android: AsyncTask
Внутренний мир 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]
На конец созрел следующий вебинар. Мы долго тянули с ним и мучились мучительными муками, проводить ли подобные вебинары.
В следующее воскресение все станет ясно.
В качестве первого объекта для вскрытия был выбран 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.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Вебинар 3. Внутренний мир Android: AsyncTask
Буду смотреть обязательно)
CEO of a company R.id.team
Re: Вебинар 3. Внутренний мир Android: AsyncTask
а поучавствовать уже всё?Finch писал(а):Буду смотреть обязательно)
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Вебинар 3. Внутренний мир Android: AsyncTask
Определилось точное время: 18:00 по Москве.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Вебинар 3. Внутренний мир Android: AsyncTask
UPD:
1) Добавил ссылку на видео http://www.youtube.com/watch?v=O_ouu4ReCc8
2) Добавил тексты программ, используемых в вебинаре.
Хотелось бы услышать мнение. Стоит ли продолжать или может сделать какие-то изменения в будущем?
1) Добавил ссылку на видео http://www.youtube.com/watch?v=O_ouu4ReCc8
2) Добавил тексты программ, используемых в вебинаре.
Хотелось бы услышать мнение. Стоит ли продолжать или может сделать какие-то изменения в будущем?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Вебинар 3. Внутренний мир Android: AsyncTask
Здравствуйте! Прежде всего хочу поблагодарить вас за ваш труд!
Вы бы не могли сделать ветку верхнего уровня и писать в ней приблизительную дату след вебинара,чтобы можно было её отслеживать. Или если имеется такая возможность, отсылать всем подписчикам дату вебинара на почту. Думаю,что ни один я, хотел бы участвовать но пропускаю из-за незнания даты проведения!
Вы бы не могли сделать ветку верхнего уровня и писать в ней приблизительную дату след вебинара,чтобы можно было её отслеживать. Или если имеется такая возможность, отсылать всем подписчикам дату вебинара на почту. Думаю,что ни один я, хотел бы участвовать но пропускаю из-за незнания даты проведения!
Re: Вебинар 3. Внутренний мир Android: AsyncTask
у нас есть подписка если вы на неё подписаны то будете получать от нас самые свежие новости (хоть мы иногда и с запозданием это делаем).lavan писал(а):Здравствуйте! Прежде всего хочу поблагодарить вас за ваш труд!
Вы бы не могли сделать ветку верхнего уровня и писать в ней приблизительную дату след вебинара,чтобы можно было её отслеживать. Или если имеется такая возможность, отсылать всем подписчикам дату вебинара на почту. Думаю,что ни один я, хотел бы участвовать но пропускаю из-за незнания даты проведения!
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Вебинар 3. Внутренний мир Android: AsyncTask
Спасибо,подписался!
Re: Вебинар 3. Внутренний мир Android: AsyncTask
Здравствуйте! Посмотрел урок возникло пару вопросов.
1) я так понимаю,что serialexecutor- это не стандартный класс java или android, а свободная реализация работы с Executor? Если да,то какую реализацию использует android|java?
2) в доках не советуют изменять дефолтное поведение executor http://developer.android.com/intl/ru/re ... rams...%29
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
SerialExecutor - это внутренний класс AsyncTask-а.lavan писал(а):Здравствуйте! Посмотрел урок возникло пару вопросов.
1) я так понимаю,что serialexecutor- это не стандартный класс java или android, а свободная реализация работы с Executor? Если да,то какую реализацию использует android|java?
Не заметил такого. Там пишут лишь о том, что пока нам не понадобится параллельно выполнение тасков, да так, что даже спать не можешь без этого, лучше использовать стандартный executor.lavan писал(а):2) в доках не советуют изменять дефолтное поведение executor http://developer.android.com/intl/ru/re ... rams...%29
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Вебинар 3. Внутренний мир Android: AsyncTask
ну в общем, да, не советуют, а предупреждают:
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
Я новичок в java. Честно посмотрел темы: потоки и дженерики, в интернете (подготовился к просмотру).
Но этого не хватило, чтобы осилить первую часть видео-ролика. Постоянное перескакивание с одной части кода на другую.
Наверно, докладчику нужно было заранее нарисовать схему, до вебинара. Рассказать по схеме, а потом показать это в коде.
В ролике другая последовательность подачи материала: вначале код, затем схема. От сложного к простому.
Во второй части хоть пример привели, 5 потоков, затем 15 потоков. Здесь, в общем, понятно.
Чего не хватает: готовых примеров, в которые можно подставлять свои данные. Желательно без " ... ", потому что не всегда удается заполнить его.
Что меня порадовало: на 41.10 написали config.get(); я посмеялся что этот код не поместили в блок try-catch.
Но на 41.40 этот код уже был помещен в этот блок
Пожелания:
1) первое сообщение этой темы. когда будет семинар - эта информация уже устарела, почему не отредактировать сообщение?
2) обычно школьникам и студентам изучающим html преподаватели говорят - никогда не делайте ссылки красным, зеленым, желтым и т.д.
в интернете пользователи уже привыкли что ссылка - синего цвета и подчеркнута.
я искал ссылку на ролик 10-15 сек в первом сообщении.
3) звук после записи ролика нужно было обработать. Инну очень громко слышно, Денис говорит тише. В наушниках - это бьет по ушам.
Но этого не хватило, чтобы осилить первую часть видео-ролика. Постоянное перескакивание с одной части кода на другую.
Наверно, докладчику нужно было заранее нарисовать схему, до вебинара. Рассказать по схеме, а потом показать это в коде.
В ролике другая последовательность подачи материала: вначале код, затем схема. От сложного к простому.
Во второй части хоть пример привели, 5 потоков, затем 15 потоков. Здесь, в общем, понятно.
Чего не хватает: готовых примеров, в которые можно подставлять свои данные. Желательно без " ... ", потому что не всегда удается заполнить его.
Что меня порадовало: на 41.10 написали config.get(); я посмеялся что этот код не поместили в блок try-catch.
Но на 41.40 этот код уже был помещен в этот блок
Пожелания:
1) первое сообщение этой темы. когда будет семинар - эта информация уже устарела, почему не отредактировать сообщение?
2) обычно школьникам и студентам изучающим html преподаватели говорят - никогда не делайте ссылки красным, зеленым, желтым и т.д.
в интернете пользователи уже привыкли что ссылка - синего цвета и подчеркнута.
я искал ссылку на ролик 10-15 сек в первом сообщении.
3) звук после записи ролика нужно было обработать. Инну очень громко слышно, Денис говорит тише. В наушниках - это бьет по ушам.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.
Свои сообщения можно редактировать - кнопка edit.
Re: Вебинар 3. Внутренний мир Android: AsyncTask
да, со звуком ужас, конечно. Я прошу прощения.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
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
trew, спасибо за отзыв. Это именно то, что я хотел увидеть. Мы обязательно учтем это в следующих вебинарах.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Вебинар 3. Внутренний мир Android: AsyncTask
Добрый день, этот вебинар мне очень помог. в своем проекте в некторых местах я использовал такие потоки, позже модифицировал их до THREAD_POOL_EXECUTOR, и вот тут я попал на то что экзекутор этот есть только с апи 11, соответственно я заляпал пока проверкой на апи лвл, вопрос в следующем нет никакой библиотеки типа как шерлока для Ансик потоков?
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Вебинар 3. Внутренний мир Android: AsyncTask
Если вам критично выполнение в 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.
[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.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Вебинар 3. Внутренний мир Android: AsyncTask
спасибо это я так и сделал, а вот как я понял работает AsyncTask без пула только по очереди как в уроке, с помощью пула расширяется до 5 а дальше мы можем расширить до 128 если не ошибаюсь. мне 5 их вполне хватит но без них не обойтись как без пула сделать 5? ниже 11 пул вообще отсутствует
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Вебинар 3. Внутренний мир Android: AsyncTask
До 11 API использовался пул. По этому, приведенный мною пример, всегда будет использовать пул.
Это уже только после 11 API начали использовать SerialExecutor.
Однако в более поздних версия AsyncTask THREAD_POOL_EXECUTOR объявлен как private и к нему нельзя получить доступ, а следовательно и размер не увеличить.
Это уже только после 11 API начали использовать SerialExecutor.
Однако в более поздних версия AsyncTask THREAD_POOL_EXECUTOR объявлен как private и к нему нельзя получить доступ, а следовательно и размер не увеличить.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Вебинар 3. Внутренний мир Android: AsyncTask
а понятно, спасибо. поленился заглянуть в исходники ниже 11 API
Re: Вебинар 3. Внутренний мир Android: AsyncTask
Посмотрел вебинар. Было кое что полезное. Как работает почти понял. Но вот больше бы инфы про внутренность. Как говорится "тема сисек не раскрыта", так само не до конца раскрыто что такое: Feature, FeatureTask (под конец более менее стало ясно), Callable, Sync (особенно).
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена