проблема с TimerTask

Ответить
vizort
Сообщения: 49
Зарегистрирован: 02 мар 2013, 22:43

проблема с TimerTask

Сообщение vizort » 28 авг 2013, 21:57

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

public class GameActivity extends Activity implements OnClickListener {
	int timerSec = 10;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.game);

		final TextView second = (TextView) findViewById(R.id.textViewTimer);
		second.setText(String.valueOf(timerSec));

		
		class SimpleTask extends TimerTask {

			public SimpleTask() {}
			
			@Override
			public void run() {
				second.setText(String.valueOf(--timerSec));
			}
		}	
		

		Timer t = new Timer();
		if(timerSec > 0)
			t.schedule(new SimpleTask(), 1000);

	}
}
таймер досчитывает до 9-и и крах приложения

лог

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

08-28 18:52:53.841: W/dalvikvm(22316): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
08-28 18:52:53.849: E/AndroidRuntime(22316): FATAL EXCEPTION: Timer-0
08-28 18:52:53.849: E/AndroidRuntime(22316): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at android.view.ViewRoot.requestLayout(ViewRoot.java:594)
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at android.view.View.requestLayout(View.java:8125)
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at android.view.View.requestLayout(View.java:8125)
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at android.view.View.requestLayout(View.java:8125)
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at android.view.View.requestLayout(View.java:8125)
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at android.widget.TableLayout.requestLayout(TableLayout.java:223)
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at android.view.View.requestLayout(View.java:8125)
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:254)
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at android.view.View.requestLayout(View.java:8125)
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at android.widget.TextView.checkForRelayout(TextView.java:5378)
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at android.widget.TextView.setText(TextView.java:2688)
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at android.widget.TextView.setText(TextView.java:2556)
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at android.widget.TextView.setText(TextView.java:2531)
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at com.letionik.knowall.client.activity.GameActivity$1SimpleTask.run(GameActivity.java:39)
08-28 18:52:53.849: E/AndroidRuntime(22316): 	at java.util.Timer$TimerImpl.run(Timer.java:289)

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: проблема с TimerTask

Сообщение rezak90 » 28 авг 2013, 22:36

потому что идёт обращение к UI интерфейсу не из UI потока... нельзя из другого потока обращаться к View
R.id.team
Политика на форуме запрещена

vizort
Сообщения: 49
Зарегистрирован: 02 мар 2013, 22:43

Re: проблема с TimerTask

Сообщение vizort » 28 авг 2013, 22:50

печаль
а что же делать?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: проблема с TimerTask

Сообщение rezak90 » 28 авг 2013, 22:55

vizort писал(а):печаль
а что же делать?
обращаться к View из UI потока))) вариантов как сделать куча, AsyncTask, Handler...
R.id.team
Политика на форуме запрещена

vizort
Сообщения: 49
Зарегистрирован: 02 мар 2013, 22:43

Re: проблема с TimerTask

Сообщение vizort » 28 авг 2013, 23:37

та я как раз и делал перед этим с хендлером, но что то не срослось(

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

public class GameActivity extends Activity implements OnClickListener {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.game);

		final TextView second = (TextView) findViewById(R.id.textViewTimer);
		int timerSec = 10;
		second.setText(String.valueOf(timerSec));

		final Handler handler = new Handler();
		while (timerSec > 0) {
			handler.postDelayed(new Runnable() {

				@Override
				public void run() {
					second.setText(String.valueOf(timerSec--));
				}
			}, 1000);
		}

	}
}
Error:
Cannot refer to a non-final variable timerSec inside an inner class defined in a different method ...

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: проблема с TimerTask

Сообщение klblk » 29 авг 2013, 06:03

урок:
http://startandroid.ru/ru/uroki/vse-uro ... anija.html

только роль Thread'а будет играть ваш TimerTask

vizort
Сообщения: 49
Зарегистрирован: 02 мар 2013, 22:43

Re: проблема с TimerTask

Сообщение vizort » 29 авг 2013, 18:58

так можно и без хендлера

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

public class GameActivity extends Activity implements OnClickListener {
	int timerSec = 10;
	TextView second;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.game);

		second = (TextView) findViewById(R.id.textViewTimer);
		second.setText(String.valueOf(timerSec));

		Timer t = new Timer();
		while (timerSec > 0) {
			t.schedule(new SimpleTask(), 1000);
			second.setText(String.valueOf(timerSec));
		}
		
	}

	class SimpleTask extends TimerTask {

		public SimpleTask() {}

		@Override
		public void run() {
			--timerSec;
		}
	}
}
только работает нестабильно, моментально принимает конечное значение которое еще к тому же может быть даже -37(

вот что получилось по уроку

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

public class GameActivity extends Activity implements OnClickListener {
	int timerSec = 10;
	TextView second;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.game);

		second = (TextView) findViewById(R.id.textViewTimer);
		second.setText(String.valueOf(timerSec));

		final Handler h = new Handler() {
			public void handleMessage(android.os.Message msg) {
				second.setText(String.valueOf(msg.what));
			};
		};

		Timer t = new Timer();
		while (timerSec > 0) {
			t.schedule(new SimpleTask(), 1000);
			h.sendEmptyMessage(timerSec);
		}

	}

	class SimpleTask extends TimerTask {

		public SimpleTask() {}

		@Override
		public void run() {
			--timerSec;
		}
	}

}
та же беда(

и вот переделал свой вариант через хендлер

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

public class GameActivity extends Activity implements OnClickListener {
	int timerSec = 10;
	TextView second;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.game);

		second = (TextView) findViewById(R.id.textViewTimer);
		second.setText(String.valueOf(timerSec));
		
		final Handler handler = new Handler();
		while (timerSec > 0) {
			handler.postDelayed(new Runnable() {

				@Override
				public void run() {}
			}, 1000);
			second.setText(String.valueOf(--timerSec));
		}

	}
}
тут хоть и обновляет моментально, но конечное значение только 0 принимает

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: проблема с TimerTask

Сообщение klblk » 30 авг 2013, 06:32

ну для начала... что это?)
[syntax=java]while (timerSec > 0) {
t.schedule(new SimpleTask(), 1000);
h.sendEmptyMessage(timerSec);
} [/syntax]

в чем состоит задача то? нужно чтобы счетчик уменьшался до 0 и это выводилось на экран?
просто таймер запущенный в цикле... это как-то печально смотрится.

весь верхний цикл замените на:
t.schedule(new SimpleTask(), 1000, 1000);
т.е. ваш SimpleTask будет выполняться каждую секунду, начиная с первой секунды.

h.sendEmptyMessage(timerSec);
это ставите в SimpleTask после --timerSec. (у вас же он запускается в основном потоке, что бессмысленно вообще)

ну и в теле хендлера проверяете условие что счетчик больше нуля и выводите текст, в противном случая делаете t.cancel();

vizort
Сообщения: 49
Зарегистрирован: 02 мар 2013, 22:43

Re: проблема с TimerTask

Сообщение vizort » 30 авг 2013, 11:53

спасибо, работает 8-)

а я вот кстати нашел способ попроще http://developer.android.com/intl/ru/re ... Timer.html

Ответить