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

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

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




Начать новую тему Ответить на тему  [ Сообщений: 58 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: 10 июн 2012, 23:00 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.

В этом уроке:


- создаем несложный пример с AsyncTask




Click here to read this article!

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Последний раз редактировалось damager82 20 май 2017, 20:09, всего редактировалось 4 раз(а).

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

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
Что то не было проблем никогда с тасками, а сейчас всплыла проблема такого характера: делаю в AsyncTask'e sleep но экран блокируется (точнее он просто чёрный).
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public class Example extends Activity {
  2.         private AuthorizationTask task;
  3.        
  4.     @Override
  5.     public void onCreate(Bundle savedInstanceState) {
  6.         super.onCreate(savedInstanceState);
  7.         setContentView(R.layout.activity_example);
  8.         init();
  9.     }
  10.    
  11.     private void init() {
  12.         Log.i("MyTag", "name thread: " + Thread.currentThread().getName());
  13.         boolean isAuthorization = false;
  14.         task = new AuthorizationTask();
  15.         task.execute(5);
  16.         try {
  17.                         isAuthorization = task.get();
  18.                 } catch (InterruptedException e) {
  19.                         Log.i("MyTag", "InterruptedException in Example");
  20.                         e.printStackTrace();
  21.                 } catch (ExecutionException e) {
  22.                         Log.i("MyTag", "ExecutionException in Example");
  23.                         e.printStackTrace();
  24.                 }
  25.         if(isAuthorization) {
  26.                 Log.i("MyTag", "authorization is true");
  27.                 Intent intent = new Intent(this, ExampleTwo.class);
  28.                 startActivity(intent);
  29.         }
  30.         else {
  31.                 Log.i("MyTag", "authorization is false");
  32.                 Intent intentLogin = new Intent(this, LoginActivity.class);
  33.                 startActivity(intentLogin);
  34.         }
  35.     }
  36.    
  37.     public class AuthorizationTask extends AsyncTask<Integer, Void, Boolean> {
  38.        
  39.         protected void onPreExecute() {
  40.                 super.onPreExecute();
  41.         }
  42.        
  43.         protected void onProgressUpdate(Void... value) {
  44.                 super.onProgressUpdate(value);
  45.                
  46.         }
  47.        
  48.         @Override
  49.         protected Boolean doInBackground(Integer... params) {
  50.                 Log.i("MyTag", "name thread: " + Thread.currentThread().getName());
  51.                 for(int i = 0; i < params[0]; i++) {
  52.                         try {
  53.                                 TimeUnit.SECONDS.sleep(1);
  54.                         } catch (InterruptedException e) {
  55.                                 Log.i("MyTag", "InterruptedException in doInBackground");
  56.                                 e.printStackTrace();
  57.                         }
  58.                 }
  59.                 return new Boolean(false);
  60.         }
  61.        
  62.         protected void onPostExecute(Boolean result) {
  63.                 super.onPostExecute(result);
  64.         }
  65.  
  66.     }
  67.  
  68. }
  69.  

sleep происходит в другом потоке, но почему тогда чёрный экран? почему тогда активити ждёт завершения AsyncTaska а потом уже вываливает экран.

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


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

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
а если убрать isAuthorization = task.get(); то sleep'a вообще не происходит, то есть сразу грузится экран.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 сен 2012, 12:54 

Зарегистрирован: 14 май 2012, 16:18
Сообщений: 372
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
попробуй init () перенести в onStart() или в onResume().
У меня тоже бывало возникали глюки с onCreate()


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

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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 сен 2012, 13:54 

Зарегистрирован: 14 май 2012, 16:18
Сообщений: 372
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Ну все правильно, task.get() останавливает UI поток и ждет выполнения задачи.
Эту задачу нужно подругому решать, я бы использовал onPreExecute и onPostExecute они выполняются в UI потоке


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

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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 сен 2012, 14:29 

Зарегистрирован: 16 июл 2012, 07:47
Сообщений: 235
Благодарил (а): 0 раз.
Поблагодарили: 25 раз.
Тогда никаких тасков не нужно - вот например, у меня запускается из onCreate():
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.         private void newGame() {
  2.                 showDialog(PROGRESS_DIALOG, null);
  3.                 Thread t = new Thread() {
  4.                         @Override
  5.                         public void run() {
  6.                                 model.newGame();
  7.                                 dismissDialog(PROGRESS_DIALOG);
  8.                         }
  9.                 };
  10.                 t.start();
  11.         }
  12.  


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 сен 2012, 18:35 

Зарегистрирован: 30 июл 2012, 13:32
Сообщений: 25
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
загружаю со страницы новости, далее все что загрузил вывожу на listview, нужно теперь реализовать диалог чтоб юзер знал что идет загрузка, но у меня что то не получается при созданий адаптера для listview выдает ошибку примерная структура моего кода, помогите плз.
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. private ArrayList<String> listTitle = new ArrayList<String>();
  2. private ArrayList<String> listLink = new ArrayList<String>();
  3. private String[] arrayTitle = new String[]{"..."};
  4. private String[] arrayLink = new String[]{"..."};
  5.  
  6. public void onCreate...{
  7. pd = ProgressDialog.show(this, "Working...", "request to server", true, false);
  8. new ParseSite().execute("http://www...");
  9. }
  10. private class ParseSite extends AsyncTask<String, Void, String[]>{
  11. @Override
  12.         protected String[] doInBackground(String... params) {
  13.                 try {
  14.                         String html = params[0];
  15.                         Document doc = Jsoup.connect(html).get();
  16.                         listTitle.clear();
  17.                         listLink.clear();
  18.                         for (Element link : doc.select("div")){
  19.                                 // Получаю массив из ссылок и содержимых href
  20.                                 }
  21.                                 arrayTitle = ConvertToStringArray(listTitle);
  22.                                 arrayLink = ConvertToStringArray(listLink);
  23.                 }
  24.                 catch (IOException e) {}
  25.                         return null;
  26.         }
  27.  
  28.         protected void onPostExecute(String[] arrayTitle) {
  29.                pd.dismiss();
  30.                lvNews = (ListView)findViewById(R.id.lvNews);
  31.                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
  32.                                         R.layout.list_news, arrayTitle);
  33.                lvNews.setAdapter(adapter);
  34.             }
  35.         }
  36.  


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 сен 2012, 19:10 

Зарегистрирован: 30 июл 2012, 13:32
Сообщений: 25
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
прогресс бар бесконечно крутиться (( убрал вот эти строчки
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. lvNews = (ListView)findViewById(R.id.lvNews);
  2. ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
  3.        R.layout.list_news, arrayTitle);
  4. lvNews.setAdapter(adapter);


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 12 сен 2012, 08:27 

Зарегистрирован: 16 июл 2012, 07:47
Сообщений: 235
Благодарил (а): 0 раз.
Поблагодарили: 25 раз.
3Gern, выбросьте массивы - они не нужны. Оставьте только списки. Адаптер принимает список в качестве аргумента.
В doInBackground() после нахождения ссылки вызывайте publishProgress();
В onProgressUpdate() обновляйте списки - и информруйте ListView что список изменился с помощью notifyDataSetChanged().
Пользователь сможет кликать на уже загруженные ссылки даже пока идёт загрузка.
Но прогрессбар крутится, означая что загрузка продолжается.
В onPostExecute() убираете прогрессбар.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 17 сен 2012, 09:35 

Зарегистрирован: 17 сен 2012, 08:16
Сообщений: 3
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Столкнулся со следующей ситуацией:
- при завершении задачи с использованием AsyncTask поток почему-то разрушается и создается новый при выполнении новой задачи;
- при работе с потоками "по-старинке" (пусть и сложновато, да еще и сохраняются корявости при повороте экрана) поток создается и разрушается как ему положено

об этих выводах ярко повествует мониторинг потоков
Вопрос таков, что выгоднее и правильнее???


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 24 сен 2012, 15:05 

Зарегистрирован: 17 сен 2012, 08:16
Сообщений: 3
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
так что никто не сталкивался с такой ситуацией?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 24 сен 2012, 15:08 
Аватар пользователя

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

правильно поток и будет пересоздаваться так как при повороте экрана активити "пересеоздаётся"

Цитата:
- при завершении задачи с использованием AsyncTask поток почему-то разрушается и создается новый при выполнении новой задачи;

а вот здесь не понятно что имеете в виду, скорее всего не правильно построили поток

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 24 сен 2012, 17:18 

Зарегистрирован: 16 июл 2012, 07:47
Сообщений: 235
Благодарил (а): 0 раз.
Поблагодарили: 25 раз.
А это уж как запрограммируете. Ни AsyncTask, ни Thread не уничтожаются при повороте экрана. Но если не принять сооветствующих мер - результат будет выводиться в старые View (которые как раз пересоздаются при повороте).
Как это делать, расказано в следующих уроках.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 28 сен 2012, 13:09 

Зарегистрирован: 17 сен 2012, 08:16
Сообщений: 3
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Да нет вопрос не про уничтожение потока при повороте экрана. Интересует то, что СПЕЦИАЛЬНО СДЕЛАННЫЙ ДЛЯ УДОБСТВО МЕХАНИЗМ AsyncTask оставляет исполняемый поток в памяти, после исполнения и закрытия такого, и при вызове снова действия, разделенного на потоки создает новый и т.д.
Thread - после разрушения пропадает.
Все ето можно наблюдать в Debug


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 28 сен 2012, 17:11 

Зарегистрирован: 16 июл 2012, 07:47
Сообщений: 235
Благодарил (а): 0 раз.
Поблагодарили: 25 раз.
А почему он должен убиваться при повороте экрана? Он продолжает работать, работать и работать - пока Вы его сами не остановите - впрочем, так же как и Thread - ведь при этом его не обазательно останавливать, достаточно его перенастроить.
А если при повороте экрана Вы не разовравжись запускаете второй экземпляр AsyncTask - тоже Ваши проблемы. Вдруг и в самом деле нужен второй AsyncTask ?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 28 сен 2012, 18:22 

Зарегистрирован: 14 май 2012, 16:18
Сообщений: 372
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Umix писал(а):
Да нет вопрос не про уничтожение потока при повороте экрана. Интересует то, что СПЕЦИАЛЬНО СДЕЛАННЫЙ ДЛЯ УДОБСТВО МЕХАНИЗМ AsyncTask оставляет исполняемый поток в памяти, после исполнения и закрытия такого, и при вызове снова действия, разделенного на потоки создает новый и т.д.
Thread - после разрушения пропадает.
Все ето можно наблюдать в Debug

В Андроид вообще никакие объекты не уничтожаются немедленно после использования, за это отвечает сборщик мусора и мы не можем никак повлиять на его работу. Можно, конечно, вызвать System.gc() но даже в этом случае разработчики Андроид не гарантируют, что он будет немедленно вызван и почистит всю память от всех неиспользуемых объектов, этой командой мы лишь уведомляем систему, что наступил удобный момент для уборки мусора.
Вообще не вижу причин для беспокойства, ну и пусть они висят DDMS, мне так они не мешают.

Что касается AsyncTasks, то его изначально планировалось использовать для разовых, коротких задач:
AsyncTasks в идеале, должны быть использованы для коротких операций (несколько секунд, не больше.) Если вам нужно сохранять потоки в течение длительного периода времени, то настоятельно рекомендуется использовать различные API, предоставляемые пакетом java.util.concurrent , таких как Executor, ThreadPoolExecutor и FutureTask


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 ноя 2012, 19:10 

Зарегистрирован: 22 ноя 2012, 18:41
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
У меня такая проблема: пытаюсь заранее создать содержимое activity с множеством View, чтобы при его вызове оно показывалось мгновенно(иначе примерно 2 секунды загружается). Как я понял, это должно получиться реализовать с помощью создания в AsyncTask, вызываемом в MainActivity, нового View, содержащего в себе все это множество вьюшек, и потом при вызове этого тяжёлого activity просто добавить в него уже созданный в предыдущем activity View.
Но столкнулся с такой проблемой, что в doInBackground не получается создать новый элемент View, так как непонятно что писать в параметры при его создании:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. LinearLayout linLayout = new LinearLayout(context);

Методы getContext() и getBaseContext() не работают... Что делать в такой ситуации?

P.S.: Я недавно начал программировать под Андройд, и, возможно, это не самый лучший способ реализовать предварительное создание тяжёлого Acivity...


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 ноя 2012, 19:31 

Зарегистрирован: 14 май 2012, 16:18
Сообщений: 372
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Обычно, если в классе нужен контекст активити или приложения, то его туда передают в конструкторе и вызывают его методы через него:

public class MyAsyncTask extends AsyncTask {

private Context mContext;

public MyAsyncTask (Context context){

this.mContext=context;

}


...

И вызывают методы контекста или передают его где нужно в конструкторы View

LinearLayout linLayout = new LinearLayout(mContext);



А в Activity передают ссылку на свой контекст (т.е. на себя) при создании объекта

MyAsyncTask myTask = new MyAsyncTask(this);


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

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


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

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