Страница 1 из 1
проблема с TimerTask
Добавлено: 28 авг 2013, 21:57
vizort
Код: Выделить всё
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)
Re: проблема с TimerTask
Добавлено: 28 авг 2013, 22:36
rezak90
потому что идёт обращение к UI интерфейсу не из UI потока... нельзя из другого потока обращаться к View
Re: проблема с TimerTask
Добавлено: 28 авг 2013, 22:50
vizort
печаль
а что же делать?
Re: проблема с TimerTask
Добавлено: 28 авг 2013, 22:55
rezak90
vizort писал(а):печаль
а что же делать?
обращаться к View из UI потока))) вариантов как сделать куча, AsyncTask, Handler...
Re: проблема с TimerTask
Добавлено: 28 авг 2013, 23:37
vizort
та я как раз и делал перед этим с хендлером, но что то не срослось(
Код: Выделить всё
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 ...
Re: проблема с TimerTask
Добавлено: 29 авг 2013, 06:03
klblk
урок:
http://startandroid.ru/ru/uroki/vse-uro ... anija.html
только роль Thread'а будет играть ваш TimerTask
Re: проблема с TimerTask
Добавлено: 29 авг 2013, 18:58
vizort
так можно и без хендлера
Код: Выделить всё
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 принимает
Re: проблема с TimerTask
Добавлено: 30 авг 2013, 06:32
klblk
ну для начала... что это?)
[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();
Re: проблема с TimerTask
Добавлено: 30 авг 2013, 11:53
vizort
спасибо, работает
а я вот кстати нашел способ попроще
http://developer.android.com/intl/ru/re ... Timer.html