Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 16 июл 2018, 09:42

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 21 окт 2013, 14:39 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Внутренний мир 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
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. private class AsyncTimer extends AsyncTask<Integer, Integer, Void> {
  2.         private TextView mTextView;
  3.        
  4.         public AsyncTimer(TextView textView) {
  5.                 super();
  6.                 mTextView = textView;
  7.         }
  8.  
  9.         @Override
  10.         protected Void doInBackground(Integer... params) {
  11.                 for(int i = params[0]; i >= 0 ;i--){
  12.                         publishProgress(i);
  13.                         try {
  14.                                 TimeUnit.SECONDS.sleep(1);
  15.                         } catch (InterruptedException e) {
  16.                                 e.printStackTrace();
  17.                         }
  18.                 }
  19.                 return null;
  20.         }
  21.        
  22.         @Override
  23.         protected void onProgressUpdate(Integer... values) {
  24.                 mTextView.setText(Timer:+ values[0].toString());
  25.         }
  26.                
  27.         @Override
  28.         protected void onPostExecute(Void result) {
  29.                 mTextView.setText("Timer: Done!");
  30.         }
  31.     }

onCreate активности
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.     public void onCreate(Bundle savedInstanceState) {
  2.         super.onCreate(savedInstanceState);
  3.  
  4.         TextView text = new TextView(this);
  5.         text.setText("Test text");
  6.         setContentView(text);
  7.        
  8.         AsyncTimer timer = new AsyncTimer(text);
  9.         timer.execute(10);
  10.     }

Измененный AsyncTimer
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.     private class AsyncTimer extends AsyncTask<Integer, Integer, Void> {
  2.         private static int TasksCount = 0;
  3.         private TextView mTextView;
  4.         private final int mTaskId;
  5.        
  6.         public AsyncTimer(TextView textView) {
  7.                 super();
  8.                 TasksCount ++;
  9.                 mTaskId = TasksCount ;
  10.                 mTextView = textView;
  11.                 mTextView.setText(getTimerName() +:Pending…”);
  12.         }
  13.  
  14.         @Override
  15.         protected Void doInBackground(Integer... params) {
  16.                 for(int i = params[0]; i >= 0 ;i--){
  17.                         publishProgress(i);
  18.                         try {
  19.                                 TimeUnit.SECONDS.sleep(1);
  20.                         } catch (InterruptedException e) {
  21.                                 e.printStackTrace();
  22.                                 return null;
  23.                         }
  24.                 }
  25.                 return null;
  26.         }
  27.                
  28.         @Override
  29.         protected void onProgressUpdate(Integer... values) {
  30.                 mTextView.setText(getTimerName() + " Time:" + values[0].toString());
  31.         }
  32.                
  33.         @Override
  34.         protected void onPostExecute(Void result) {
  35.                 mTextView.setText(getTimerName() + ": Done!");
  36.         }
  37.  
  38.         private String getTimerName() {
  39.                 returnTimer(+ mTaskId +);
  40.         }
  41.     }

Измененный onCreate активности
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.     private static final int TIMERS_COUNT = 5;
  2.  
  3.     public void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.  
  6.         LinearLayout layout = new LinearLayout(this);
  7.         layout.setOrientation(LinearLayout.VERTICAL);
  8.         setContentView(layout);
  9.        
  10.         for(int i = 0; i < TIMERS_COUNT; i++) {
  11.                 TextView text = new TextView(this);
  12.                 text.setText("Test text");
  13.                 layout.addView(text);
  14.                
  15.                 AsyncTimer timer = new AsyncTimer(text);
  16.                 timer.execute(10);
  17.         }
  18.     }

Оператор увеличения размера пула
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. ((ThreadPoolExecutor) AsyncTask.THREAD_POOL_EXECUTOR).setCorePoolSize(TIMERS_COUNT);

Пример использования FutureTask
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. FutureTask<Configuration> config= new FutureTask<Configuration>(new Callable<Configuration>() {
  2.         @Override
  3.         public Configuration call() throws Exception {
  4.                 Configuration result = null;
  5.                
  6.                 //Загрузка конфигурации...
  7.                
  8.                 return result;
  9.         }
  10. }) {
  11.         public void done() {
  12.                 // Загрузка закончена...
  13.         }
  14. };
  15. new Thread(config).start();

Пример выполнения асинхронного кода без AsyncTask
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. Thread thread = new Thread() {
  2.         public void run() {
  3.                 // Тут основной код
  4.                 // .......
  5.                
  6.                 runOnUiThread(new Runnable() {
  7.                         @Override
  8.                         public void run() {
  9.                                 // Тут что-то, что выполняется в основном потоке
  10.                         }
  11.                 });
  12.         };
  13. };
  14. thread.start();

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Последний раз редактировалось KamiSempai 28 окт 2013, 22:09, всего редактировалось 3 раз(а).

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 окт 2013, 00:44 
Аватар пользователя

Зарегистрирован: 16 июл 2012, 21:37
Сообщений: 439
Благодарил (а): 0 раз.
Поблагодарили: 27 раз.
Буду смотреть обязательно)

_________________
CEO of a company R.id.team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 окт 2013, 14:57 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
Finch писал(а):
Буду смотреть обязательно)

а поучавствовать уже всё?

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 24 окт 2013, 12:30 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Определилось точное время: 18:00 по Москве.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 28 окт 2013, 22:13 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
UPD:
1) Добавил ссылку на видео http://www.youtube.com/watch?v=O_ouu4ReCc8
2) Добавил тексты программ, используемых в вебинаре.

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

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 окт 2013, 12:10 

Зарегистрирован: 27 ноя 2012, 20:25
Сообщений: 27
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Здравствуйте! Прежде всего хочу поблагодарить вас за ваш труд!
Вы бы не могли сделать ветку верхнего уровня и писать в ней приблизительную дату след вебинара,чтобы можно было её отслеживать. Или если имеется такая возможность, отсылать всем подписчикам дату вебинара на почту. Думаю,что ни один я, хотел бы участвовать но пропускаю из-за незнания даты проведения!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 окт 2013, 12:16 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
lavan писал(а):
Здравствуйте! Прежде всего хочу поблагодарить вас за ваш труд!
Вы бы не могли сделать ветку верхнего уровня и писать в ней приблизительную дату след вебинара,чтобы можно было её отслеживать. Или если имеется такая возможность, отсылать всем подписчикам дату вебинара на почту. Думаю,что ни один я, хотел бы участвовать но пропускаю из-за незнания даты проведения!

у нас есть подписка если вы на неё подписаны то будете получать от нас самые свежие новости (хоть мы иногда и с запозданием это делаем).

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 окт 2013, 12:38 

Зарегистрирован: 27 ноя 2012, 20:25
Сообщений: 27
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Спасибо,подписался!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 окт 2013, 13:08 

Зарегистрирован: 27 ноя 2012, 20:25
Сообщений: 27
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Здравствуйте! Посмотрел урок возникло пару вопросов.
1) я так понимаю,что serialexecutor- это не стандартный класс java или android, а свободная реализация работы с Executor? Если да,то какую реализацию использует android|java?
2) в доках не советуют изменять дефолтное поведение executor http://developer.android.com/intl/ru/reference/android/os/AsyncTask.html#execute%28Params...%29


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 окт 2013, 14:02 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
lavan писал(а):
Здравствуйте! Посмотрел урок возникло пару вопросов.
1) я так понимаю,что serialexecutor- это не стандартный класс java или android, а свободная реализация работы с Executor? Если да,то какую реализацию использует android|java?
SerialExecutor - это внутренний класс AsyncTask-а.
lavan писал(а):
2) в доках не советуют изменять дефолтное поведение executor http://developer.android.com/intl/ru/reference/android/os/AsyncTask.html#execute%28Params...%29
Не заметил такого. Там пишут лишь о том, что пока нам не понадобится параллельно выполнение тасков, да так, что даже спать не можешь без этого, лучше использовать стандартный executor.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 окт 2013, 17:38 

Зарегистрирован: 27 ноя 2012, 20:25
Сообщений: 27
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
ну в общем, да, не советуют, а предупреждают:
Цитата:
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.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 05 ноя 2013, 11:20 
Аватар пользователя

Зарегистрирован: 28 сен 2013, 17:34
Сообщений: 450
Благодарил (а): 8 раз.
Поблагодарили: 110 раз.
Я новичок в java. Честно посмотрел темы: потоки и дженерики, в интернете (подготовился к просмотру).
Но этого не хватило, чтобы осилить первую часть видео-ролика. Постоянное перескакивание с одной части кода на другую.
Наверно, докладчику нужно было заранее нарисовать схему, до вебинара. Рассказать по схеме, а потом показать это в коде.
В ролике другая последовательность подачи материала: вначале код, затем схема. От сложного к простому.

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

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

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

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

_________________
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 05 ноя 2013, 12:19 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 12:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
да, со звуком ужас, конечно. Я прошу прощения.

_________________
R.id.team

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 13 ноя 2013, 13:22 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
trew, спасибо за отзыв. Это именно то, что я хотел увидеть. Мы обязательно учтем это в следующих вебинарах.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 19 дек 2013, 09:54 
Аватар пользователя

Зарегистрирован: 21 сен 2012, 09:25
Сообщений: 45
Благодарил (а): 1 раз.
Поблагодарили: 4 раз.
Добрый день, этот вебинар мне очень помог. в своем проекте в некторых местах я использовал такие потоки, позже модифицировал их до THREAD_POOL_EXECUTOR, и вот тут я попал на то что экзекутор этот есть только с апи 11, соответственно я заляпал пока проверкой на апи лвл, вопрос в следующем нет никакой библиотеки типа как шерлока для Ансик потоков?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 19 дек 2013, 11:45 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Если вам критично выполнение в ThreadPoolExecutor, можно соорудить что-то на подобии такого класса:

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.     public abstract class ThreadPoolAsynchTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
  2.         public ThreadPoolAsynchTask<Params, Progress, Result> executeOnThreadPool(Params... params) {
  3.                  if(android.os.Build.VERSION.SDK_INT < 11) execute(params);
  4.                  else executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
  5.                  return this;
  6.         }
  7.     }

Тогда, при вызове executeOnThreadPool, AsyncTask будет выполняться при помощи пула потоков.
Однако есть одно ограничение, для API < 11 вы не сможете поставить количество потоков больше 5.
Если все-же вам необходимо наличие большего количества потоков, я бы посоветовал подумать об пересмотре структуры программы, возможно большую часть AsyncTask-ов можно объединить в одну общую группу и обрабатывать данные этой группы в одном потоке. Я бы мог более подробно сказать как это можно сделать, если вы мне расскажете как вы используете AsyncTask.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 19 дек 2013, 16:54 
Аватар пользователя

Зарегистрирован: 21 сен 2012, 09:25
Сообщений: 45
Благодарил (а): 1 раз.
Поблагодарили: 4 раз.
спасибо это я так и сделал, а вот как я понял работает AsyncTask без пула только по очереди как в уроке, с помощью пула расширяется до 5 а дальше мы можем расширить до 128 если не ошибаюсь. мне 5 их вполне хватит но без них не обойтись как без пула сделать 5? ниже 11 пул вообще отсутствует


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 19 дек 2013, 22:25 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
До 11 API использовался пул. По этому, приведенный мною пример, всегда будет использовать пул.
Это уже только после 11 API начали использовать SerialExecutor.

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

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 20 дек 2013, 09:31 
Аватар пользователя

Зарегистрирован: 21 сен 2012, 09:25
Сообщений: 45
Благодарил (а): 1 раз.
Поблагодарили: 4 раз.
а понятно, спасибо. поленился заглянуть в исходники ниже 11 API


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 21 апр 2014, 16:05 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
Посмотрел вебинар. Было кое что полезное. Как работает почти понял. Но вот больше бы инфы про внутренность. Как говорится "тема сисек не раскрыта", так само не до конца раскрыто что такое: Feature, FeatureTask (под конец более менее стало ясно), Callable, Sync (особенно).

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB