Код таймера сбой моего приложения

Я изучаю разработку Android, и то, что я пытаюсь сделать, - это иметь ярлык, отсчитываемый от 40 минут, и когда он достигнет 0, он перестанет считать и сделает что-то еще. Это мой код:

@Override
protected void onStart() {
 super.onStart();
 count = 2400;
 final Timer t = new Timer();//Create the object
 t.scheduleAtFixedRate(new TimerTask() {
 @Override
 public void run() {
 minLeft = (int) Math.floor(count / 60);
 secLeft = count - minLeft * 60;
 counter = minLeft + ":" + secLeft;
 TextView tv = (TextView) findViewById(R.id.timer);

 Log.i(MainActivity.TAG,minLeft+", "+secLeft+", "+counter);
 tv.setText(counter);
 count--;
 if (minLeft <= 0 && secLeft <= 0) {
 t.cancel();
 count = 2400;
 onFinish();
 }
 }
 }, 1000, 1000);
 }

Но, когда я перехожу к этому действию, нажав кнопку в основном действии, на этикетке есть текст "Таймер" (его исходный текст), и через несколько секунд приложение вылетает с вызовом CalledFromWrongThreadException, но строка, вызывающая проблему, кажется чтобы быть тем, где я устанавливаю текст TextView.

Пожалуйста, помогите, спасибо заранее.

1 ответ

Запланированное задание выполняется в фоновом потоке. И вы пытаетесь установить текст в текстовое изображение из этого фонового потока. Однако в Android все связанные с этим операции должны выполняться в основном потоке.

Таким образом, в запланированной задаче вы должны использовать что-то вроде:

@Override
protected void onStart() {
 super.onStart();
 count = 2400;
 final Timer t = new Timer();//Create the object
 t.scheduleAtFixedRate(new TimerTask() {
 @Override
 public void run() {
 minLeft = (int) Math.floor(count / 60);
 secLeft = count - minLeft * 60;
 counter = minLeft + ":" + secLeft;
 // the name of your actual activity
 MyActivity.this.runOnUiThread(new Runnable() {
 @Override
 public void run() {
 TextView tv = (TextView) findViewById(R.id.timer);
 Log.i(MainActivity.TAG,minLeft+", "+secLeft+", "+counter);
 tv.setText(counter);
 }
 });

 count--;
 if (minLeft <= 0 && secLeft <= 0) {
 t.cancel();
 count = 2400;
 onFinish();
 }
 }
 }, 1000, 1000);
}

Также обратите внимание, что этот код можно написать более элегантно, без всех/стольких анонимных классов, но он должен сделать трюк.

licensed under cc by-sa 3.0 with attribution.