Урок 86. AsyncTask. Знакомство, несложный пример

Обсуждение уроков
Аватара пользователя
ristar
Сообщения: 4
Зарегистрирован: 19 апр 2013, 10:41

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение ristar » 28 апр 2013, 11:35

Xpert043 писал(а):Попробовал выполнить этот урок у себя на компьютере. Получил такое. Чего можно починить, чтобы заработало?
Текст activity_main.xml:

[syntax=xml]<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onclick"
android:text="@string/start">
</Button>
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ProgressBar>
<TextView
android:id="@+id/tvInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="">
</TextView>
</LinearLayout>[/syntax]

В папке gen есть файл R.java? Попробуй почистить проект (Project->Clean)

Xpert043
Сообщения: 34
Зарегистрирован: 12 июн 2012, 20:13

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Xpert043 » 28 апр 2013, 12:28

Разобрался. Ругался на отсутствие
" <string name="action_settings">Settings</string> "
в файле string.xml. В уроке этой строки нет, а на новых версиях видимо ругается программа

Xpert043
Сообщения: 34
Зарегистрирован: 12 июн 2012, 20:13

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Xpert043 » 12 май 2013, 18:27

Вопрос. Вот я выполнил определенную задачу в отдельном потоке. Результат работы вывел в методе onPostExecute.
Результатом является заполненный список ListView.
И теперь, чтобы обрабатывать нажатия на элементы списка, я должен работать в MainActivity в методе setOnItemClickListener? или работу со списком (и весь оставшийся код) тоже производить в onPostExecute?

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

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Foenix » 12 май 2013, 20:07

можно в MainActivity, там, где определяешь вью самого списка - посмотри соответствующий урок..
R.id.team

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

NeoSvet
Сообщения: 11
Зарегистрирован: 19 авг 2013, 20:21

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение NeoSvet » 19 авг 2013, 20:34

Здравствуйте! Спасибо за уроки! :-)

Я посредством AsyncTask решил реализовать мультизагрузчик файлов.. но вот не задача - когда одна копия класса AsyncTask выполняется, то вторая пробегает onPreExecute, а к doInBackground не приступает, пока первая загрузка не закончится!..
Неужели, AsyncTask для этой задачи не подойдет?.. А что подойдет?...

Так происходит на Android 4.1.1, а на 2.3.6 нормально, работает как надо!... )))

NeoSvet
Сообщения: 11
Зарегистрирован: 19 авг 2013, 20:21

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение NeoSvet » 20 авг 2013, 08:41

Оказалось, что найти решение в интернете не так уж сложно.. И в итоге у меня получилась такая конструкция:

Код: Выделить всё

if(android.os.Build.VERSION.SDK_INT>10)
	alLoader.get(i).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,params);
else	
	alLoader.get(i).execute(params);
alLoader - это ArrayList<Loader>
params - это я так заменил свои параметры, чтобы вас не пугать...)))

TomPO
Сообщения: 6
Зарегистрирован: 24 авг 2013, 00:06

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение TomPO » 12 сен 2013, 18:07

В MainActivity есть метод:

Код: Выделить всё

public void refreshBDContact(){
		cursortmp = getContentResolver().query(
				Uri.parse("content://icc/adn/"), null, null, null,
				null);					
		cursor = db.fillDB(cursortmp);

		mAdapter.changeCursor(cursor);
		cursor.requery();
		changeListFooter();	
	}
И есть асинхронная задача:

Код: Выделить всё

class MyTaskClass extends AsyncTask<Void, Void, Void>{
		
		public ProgressDialog pb;
		Context ctx;	
		MainActivity act;
		
		public MyTaskClass(Context _context, MainActivity _activity){
			ctx = _context;
			this.act = _activity;
		}
		
		@Override
		protected void onPostExecute(Void result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
			if (pb.isShowing())
				pb.dismiss();
		}

		@Override
		protected void onPreExecute() {
			// TODO Auto-generated method stub
			super.onPreExecute();
			pb = new ProgressDialog(ctx);
			pb.setTitle("Подождите");
			pb.setMessage("Идет загрузка контактов с SIM");
			pb.show();			
		}

		@Override
		protected Void doInBackground(Void... params) {
			// TODO Auto-generated method stub	
			act.refreshBDContact();
			return null;
		}	
	}
При выполнении асинхронной задачи, где вызывается метод refreshBDContact() почему-то выдает ошибку.
Если вызвать метод refreshBDContact() из самой MainActivity - все работает на ура, а вот из асинхронной задачи не выходит.
Подскажите, как правильно вызвать метод refreshBDContact() из асинхронной задачи?

Асинхронную задачу вызываю так:

Код: Выделить всё

MyTaskClass mt = new MyTaskClass(this, MainActivity.this);
			mt.execute();

mercuriy94
Сообщения: 16
Зарегистрирован: 02 апр 2013, 22:44

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение mercuriy94 » 14 окт 2013, 14:29

Всем привет, нужна помощ) я вот что думал doInBackground не имеет доступа к UI, но тут такая штука
вот фрагмент кода

Код: Выделить всё

  @Override
    protected String doInBackground(String... pr1) { 
	    Intent listenIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
	   
	    listenIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, 
	           getClass().getPackage().getName());
	  
	    listenIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Say a word!");
	  
	    
	    listenIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
	            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
	    listenIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS,new Long(20000));
		 
	   
	    listenIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);
	  
	   
	    startActivityForResult(listenIntent, VR_REQUEST);

        return null;
    }
а вопрос в следующем почему когда я вызываю этот AsyncTasc то вылазиет это активити распознование речи, хотелось бы что бы его не было, может попробывать через сервис?

Kotsu
Сообщения: 4
Зарегистрирован: 16 авг 2014, 12:01

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Kotsu » 17 авг 2014, 21:23

Привет.
Получается doInBackground() выполняется в отдельно потоке, а можем ли мы из этого потока в этом методе создать ExecutorService с несколькими потоками?
Получится UI поток + AsynTask поток + исходящие из него потоки или ничего не получится?

Stannm
Сообщения: 6
Зарегистрирован: 24 мар 2015, 15:12

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Stannm » 27 мар 2015, 15:31

Добрый день.
Сделал отдельный от Activity класс, где реализовано выполнение некоторой задачи.
Есть Activity, при нажатии на кнопку которой вызывается метод класса, описанного выше.
Подскажите, пожалуйста, а как можно передавать сообщение о результате выполнения задачи из класса в активити?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение doter.ua » 27 мар 2015, 17:17

Stannm писал(а):Добрый день.
Сделал отдельный от Activity класс, где реализовано выполнение некоторой задачи.
Есть Activity, при нажатии на кнопку которой вызывается метод класса, описанного выше.
Подскажите, пожалуйста, а как можно передавать сообщение о результате выполнения задачи из класса в активити?
Метод может возвращать что-нибудь:
public Что-нибудь myMethod(){ ... return Что-нибудь }

Что-нибудь myVar = MyClass.myMethod();
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Stannm
Сообщения: 6
Зарегистрирован: 24 мар 2015, 15:12

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Stannm » 30 мар 2015, 08:56

doter.ua писал(а): Метод может возвращать что-нибудь:
public Что-нибудь myMethod(){ ... return Что-нибудь }

Что-нибудь myVar = MyClass.myMethod();
Так не получается, может я не так выразился. В классе MyClass в AsyncTask выполняется задача. Мне нужно передавать промежуточные результаты в Activity. Как это можно сделать?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение doter.ua » 30 мар 2015, 09:49

Stannm писал(а):
doter.ua писал(а): Метод может возвращать что-нибудь:
public Что-нибудь myMethod(){ ... return Что-нибудь }

Что-нибудь myVar = MyClass.myMethod();
Так не получается, может я не так выразился. В классе MyClass в AsyncTask выполняется задача. Мне нужно передавать промежуточные результаты в Activity. Как это можно сделать?
загугли asynctask publishProgress(), да и в уроках это есть(в 87).
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Stannm
Сообщения: 6
Зарегистрирован: 24 мар 2015, 15:12

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Stannm » 31 мар 2015, 14:33

doter.ua писал(а):
Stannm писал(а):
doter.ua писал(а): Метод может возвращать что-нибудь:
public Что-нибудь myMethod(){ ... return Что-нибудь }

Что-нибудь myVar = MyClass.myMethod();
Так не получается, может я не так выразился. В классе MyClass в AsyncTask выполняется задача. Мне нужно передавать промежуточные результаты в Activity. Как это можно сделать?
загугли asynctask publishProgress(), да и в уроках это есть(в 87).
Да, но у меня async task не в Main Activity и не может получить доступ к элементам его.

rePlay
Сообщения: 7
Зарегистрирован: 11 июл 2015, 17:54

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение rePlay » 28 июл 2015, 20:47

Здравствуйте. Из первых сообщений в теме, узнал, что возможно AsyncTask приводит к утечке памяти. Так ли это? По крайней мере GC не освобождает память, выделенную под созданные экземпляры AsyncTask (GC вызывал через DDMS).
Почему такое происходит и как правильно перезаписать код, чтобы утечек не было?

Аватара пользователя
Kirill
Сообщения: 19
Зарегистрирован: 09 сен 2015, 13:53

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Kirill » 16 сен 2015, 22:59

rePlay писал(а):Здравствуйте. Из первых сообщений в теме, узнал, что возможно AsyncTask приводит к утечке памяти. Так ли это? По крайней мере GC не освобождает память, выделенную под созданные экземпляры AsyncTask (GC вызывал через DDMS).
Почему такое происходит и как правильно перезаписать код, чтобы утечек не было?
Утечка происходит из-за того что GC не очищает Активити после того как оно закрывается (например из-за смены ориентации экрана, или пользователь закрыл это активити) если в этот момент doInBackground продолжает работу. Активити связан с потоком асинктаска, а точнее с объектом этого класса т.к. любой внутренний класс содержит ссылку на объект внешнего класса.
Получается что каждый раз когда мы внутри активити создаем внутренний класс MyTask extends AsyncTask{... то нем сохраняется ссылка на объект текущего внешнего класса (Активити).
Если использовать асинктаск по назначению (официально рекомендуют использовать для задач длящихся ~ 2 сек) тогда проблем быть не должно.
Но если есть желание даже теоретически не допускать таких ситуаций можно почитать как это решается http://simonvt.net/2014/04/17/asynctask ... -feel-bad/

AndreiMaxx
Сообщения: 9
Зарегистрирован: 15 окт 2015, 15:14

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение AndreiMaxx » 23 окт 2015, 11:53

Здравствуйте, у меня есть кнопка которая запускает задачу в async task, однако если нажать на кнопку сразу два раза вылетает ошибка. Как лучше сделать чтобы ошибка не выскакивала. Пробовал в onpreexecute спрятать кнопку на время работы async task, но почему то этот метод не видет кнопку. Заранее спасибо за любой ответ.

makaveliS
Сообщения: 1
Зарегистрирован: 30 май 2016, 15:46

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение makaveliS » 28 сен 2016, 18:30

Нажимаю кнопку, стартует AsynkTask, и анимация кнопки замораживается, так и должно быть? Во время работы асинк, UI блокируется или я не так понял назначение этого средства?

Ответить