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

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 26 июн 2019, 21:05

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




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: проблема с TimerTask
СообщениеДобавлено: 28 авг 2013, 21:57 

Зарегистрирован: 02 мар 2013, 22:43
Сообщений: 49
Благодарил (а): 6 раз.
Поблагодарили: 0 раз.
Код: [ Загрузить ] [ Скрыть ]
  1. public class GameActivity extends Activity implements OnClickListener { 
  2.     int timerSec = 10; 
  3.  
  4.     @Override 
  5.     protected void onCreate(Bundle savedInstanceState) { 
  6.         super.onCreate(savedInstanceState); 
  7.  
  8.         setContentView(R.layout.game); 
  9.  
  10.         final TextView second = (TextView) findViewById(R.id.textViewTimer); 
  11.         second.setText(String.valueOf(timerSec)); 
  12.  
  13.          
  14.         class SimpleTask extends TimerTask { 
  15.  
  16.             public SimpleTask() {} 
  17.              
  18.             @Override 
  19.             public void run() { 
  20.                 second.setText(String.valueOf(--timerSec)); 
  21.             } 
  22.         }     
  23.          
  24.  
  25.         Timer t = new Timer(); 
  26.         if(timerSec > 0) 
  27.             t.schedule(new SimpleTask(), 1000); 
  28.  
  29.     } 


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

лог
Код: [ Загрузить ] [ Скрыть ]
  1. 08-28 18:52:53.841: W/dalvikvm(22316): threadid=7: thread exiting with uncaught exception (group=0x4001d800) 
  2. 08-28 18:52:53.849: E/AndroidRuntime(22316): FATAL EXCEPTION: Timer-0 
  3. 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. 
  4. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at android.view.ViewRoot.checkThread(ViewRoot.java:2802) 
  5. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at android.view.ViewRoot.requestLayout(ViewRoot.java:594) 
  6. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at android.view.View.requestLayout(View.java:8125) 
  7. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at android.view.View.requestLayout(View.java:8125) 
  8. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at android.view.View.requestLayout(View.java:8125) 
  9. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at android.view.View.requestLayout(View.java:8125) 
  10. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at android.widget.TableLayout.requestLayout(TableLayout.java:223) 
  11. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at android.view.View.requestLayout(View.java:8125) 
  12. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:254) 
  13. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at android.view.View.requestLayout(View.java:8125) 
  14. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at android.widget.TextView.checkForRelayout(TextView.java:5378) 
  15. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at android.widget.TextView.setText(TextView.java:2688) 
  16. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at android.widget.TextView.setText(TextView.java:2556) 
  17. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at android.widget.TextView.setText(TextView.java:2531) 
  18. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at com.letionik.knowall.client.activity.GameActivity$1SimpleTask.run(GameActivity.java:39) 
  19. 08-28 18:52:53.849: E/AndroidRuntime(22316):     at java.util.Timer$TimerImpl.run(Timer.java:289) 


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: проблема с TimerTask
СообщениеДобавлено: 28 авг 2013, 22:36 
Аватар пользователя

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

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: проблема с TimerTask
СообщениеДобавлено: 28 авг 2013, 22:50 

Зарегистрирован: 02 мар 2013, 22:43
Сообщений: 49
Благодарил (а): 6 раз.
Поблагодарили: 0 раз.
печаль
а что же делать?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: проблема с TimerTask
СообщениеДобавлено: 28 авг 2013, 22:55 
Аватар пользователя

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

обращаться к View из UI потока))) вариантов как сделать куча, AsyncTask, Handler...

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: проблема с TimerTask
СообщениеДобавлено: 28 авг 2013, 23:37 

Зарегистрирован: 02 мар 2013, 22:43
Сообщений: 49
Благодарил (а): 6 раз.
Поблагодарили: 0 раз.
та я как раз и делал перед этим с хендлером, но что то не срослось(

Код: [ Загрузить ] [ Скрыть ]
  1. public class GameActivity extends Activity implements OnClickListener { 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.  
  7.         setContentView(R.layout.game); 
  8.  
  9.         final TextView second = (TextView) findViewById(R.id.textViewTimer); 
  10.         int timerSec = 10; 
  11.         second.setText(String.valueOf(timerSec)); 
  12.  
  13.         final Handler handler = new Handler(); 
  14.         while (timerSec > 0) { 
  15.             handler.postDelayed(new Runnable() { 
  16.  
  17.                 @Override 
  18.                 public void run() { 
  19.                     second.setText(String.valueOf(timerSec--)); 
  20.                 } 
  21.             }, 1000); 
  22.         } 
  23.  
  24.     } 


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: проблема с TimerTask
СообщениеДобавлено: 29 авг 2013, 06:03 
Аватар пользователя

Зарегистрирован: 18 окт 2012, 11:17
Сообщений: 1098
Откуда: г. Красноярск
Благодарил (а): 26 раз.
Поблагодарили: 279 раз.
урок:
http://startandroid.ru/ru/uroki/vse-uroki-spiskom/143-urok-80-handler-nemnogo-teorii-nagljadnyj-primer-ispolzovanija.html

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: проблема с TimerTask
СообщениеДобавлено: 29 авг 2013, 18:58 

Зарегистрирован: 02 мар 2013, 22:43
Сообщений: 49
Благодарил (а): 6 раз.
Поблагодарили: 0 раз.
так можно и без хендлера
Код: [ Загрузить ] [ Скрыть ]
  1. public class GameActivity extends Activity implements OnClickListener { 
  2.     int timerSec = 10; 
  3.     TextView second; 
  4.  
  5.     @Override 
  6.     protected void onCreate(Bundle savedInstanceState) { 
  7.         super.onCreate(savedInstanceState); 
  8.         setContentView(R.layout.game); 
  9.  
  10.         second = (TextView) findViewById(R.id.textViewTimer); 
  11.         second.setText(String.valueOf(timerSec)); 
  12.  
  13.         Timer t = new Timer(); 
  14.         while (timerSec > 0) { 
  15.             t.schedule(new SimpleTask(), 1000); 
  16.             second.setText(String.valueOf(timerSec)); 
  17.         } 
  18.          
  19.     } 
  20.  
  21.     class SimpleTask extends TimerTask { 
  22.  
  23.         public SimpleTask() {} 
  24.  
  25.         @Override 
  26.         public void run() { 
  27.             --timerSec; 
  28.         } 
  29.     } 

только работает нестабильно, моментально принимает конечное значение которое еще к тому же может быть даже -37(

вот что получилось по уроку
Код: [ Загрузить ] [ Скрыть ]
  1. public class GameActivity extends Activity implements OnClickListener { 
  2.     int timerSec = 10; 
  3.     TextView second; 
  4.  
  5.     @Override 
  6.     protected void onCreate(Bundle savedInstanceState) { 
  7.         super.onCreate(savedInstanceState); 
  8.         setContentView(R.layout.game); 
  9.  
  10.         second = (TextView) findViewById(R.id.textViewTimer); 
  11.         second.setText(String.valueOf(timerSec)); 
  12.  
  13.         final Handler h = new Handler() { 
  14.             public void handleMessage(android.os.Message msg) { 
  15.                 second.setText(String.valueOf(msg.what)); 
  16.             }; 
  17.         }; 
  18.  
  19.         Timer t = new Timer(); 
  20.         while (timerSec > 0) { 
  21.             t.schedule(new SimpleTask(), 1000); 
  22.             h.sendEmptyMessage(timerSec); 
  23.         } 
  24.  
  25.     } 
  26.  
  27.     class SimpleTask extends TimerTask { 
  28.  
  29.         public SimpleTask() {} 
  30.  
  31.         @Override 
  32.         public void run() { 
  33.             --timerSec; 
  34.         } 
  35.     } 
  36.  

та же беда(

и вот переделал свой вариант через хендлер
Код: [ Загрузить ] [ Скрыть ]
  1. public class GameActivity extends Activity implements OnClickListener { 
  2.     int timerSec = 10; 
  3.     TextView second; 
  4.  
  5.     @Override 
  6.     protected void onCreate(Bundle savedInstanceState) { 
  7.         super.onCreate(savedInstanceState); 
  8.         setContentView(R.layout.game); 
  9.  
  10.         second = (TextView) findViewById(R.id.textViewTimer); 
  11.         second.setText(String.valueOf(timerSec)); 
  12.          
  13.         final Handler handler = new Handler(); 
  14.         while (timerSec > 0) { 
  15.             handler.postDelayed(new Runnable() { 
  16.  
  17.                 @Override 
  18.                 public void run() {} 
  19.             }, 1000); 
  20.             second.setText(String.valueOf(--timerSec)); 
  21.         } 
  22.  
  23.     } 

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: проблема с TimerTask
СообщениеДобавлено: 30 авг 2013, 06:32 
Аватар пользователя

Зарегистрирован: 18 окт 2012, 11:17
Сообщений: 1098
Откуда: г. Красноярск
Благодарил (а): 26 раз.
Поблагодарили: 279 раз.
ну для начала... что это?)
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. while (timerSec > 0) {
  2.       t.schedule(new SimpleTask(), 1000);
  3.       h.sendEmptyMessage(timerSec);
  4. }


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

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

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

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: проблема с TimerTask
СообщениеДобавлено: 30 авг 2013, 11:53 

Зарегистрирован: 02 мар 2013, 22:43
Сообщений: 49
Благодарил (а): 6 раз.
Поблагодарили: 0 раз.
спасибо, работает 8-)

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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

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


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

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