В сервисе перестал работать таймер

Закрыто
Sb_i
Сообщения: 3
Зарегистрирован: 24 авг 2012, 12:37

В сервисе перестал работать таймер

Сообщение Sb_i » 24 авг 2012, 22:00

Доброго времени суток!

В активити все нормально работало, проблем с таймерами (их два) не возникало. Как только код был перемещен в сервис (все нужные данные сервису тоже переданы), приложение стало вылетать с ошибкой: "Произошла неожиданная остановка приложения AutoSilent (процесс auto.answer.silent). Повторите попытку." Судя по логам, до таймеров дело просто не доходит, приложение вылетает на моменте вызова таймера.
Как это исправить?

Спасибо

Код кнопки из активити:

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

 public void onClickStart(View v) {

		Log.d(LOG_TAG, "onClick");
		final Calendar c = Calendar.getInstance();
	    rhour = c.get(Calendar.HOUR_OF_DAY);
	    rmin = c.get(Calendar.MINUTE);
	    fromh = Integer.parseInt(frhtext.getText().toString());
	    toh = Integer.parseInt(tohtext.getText().toString());
		from = Integer.parseInt(frtext.getText().toString());
		to = Integer.parseInt(totext.getText().toString());
		 startService(new Intent(this, Aservice.class).putExtra("rhour", rhour).putExtra("rmin", rmin)
				 .putExtra("fromh", fromh).putExtra("toh", toh).putExtra("from", from).putExtra("to", to));
		 
    }
StartCommand

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

public int onStartCommand(Intent intent, int flags, int startId){
		Log.d(LOG_TAG, "onStartCommand");
		int rhour = intent.getIntExtra("rhour",1);
		int rmin = intent.getIntExtra("rmin", 1);
		int fromh = intent.getIntExtra("fromh", 1);
		int toh = intent.getIntExtra("toh", 1);
		int from = intent.getIntExtra("from", 1);
		int to = intent.getIntExtra("to", 1);
	    MyRun mr = new MyRun(rhour, rmin, fromh, toh, from, to, startId);
	    es.execute(mr);
		 return START_REDELIVER_INTENT;
	}
Основная часть, со значениями переменных проблем нет (в логах все ок).

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

		public void run() {
			 Log.d(LOG_TAG, "MyRun#" + startId + " start, time = " +" "+ rhour +" "+ rmin +" " + fromh +" "+ toh +" "+ from + " "  + to);
			 Log.d(LOG_TAG, "main task");
			 final Calendar c = Calendar.getInstance();
		    	class MyCount extends CountDownTimer{
		        	public MyCount(long millisInFuture, long countDownInterval) {
		        	super(millisInFuture, countDownInterval);
		        	}

					@Override
					public void onFinish() {
						// TODO Auto-generated method stub
					/*mtext.setText("Звук включен");*/
					  AudioManager audiomanager = (AudioManager) getBaseContext()
				        		.getSystemService(Context.AUDIO_SERVICE);
					audiomanager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
					stopSelf(startId);
					}

					@Override
					public void onTick(long millisUntilFinished) {
						Toast.makeText(getApplicationContext(), "Silent", Toast.LENGTH_SHORT).show();
						// TODO Auto-generated method stub
						/*mtext.setText("Осталось "+millisUntilFinished/60000);*/
					}
		        }
		    	class checktime extends CountDownTimer{
		    	public checktime(long millisInFuture, long countDownInterval) {
		        	super(millisInFuture, countDownInterval);
		        	}

					public void onFinish() {
						// TODO Auto-generated method stub
						   AudioManager audiomanager = (AudioManager) getBaseContext()
					        		.getSystemService(Context.AUDIO_SERVICE);
					        audiomanager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
						int end = ((toh - fromh - 1)*60 + (60 - from + to))*60000;
						 MyCount counter = new MyCount(end,60000);
					        counter.start();
					}

					public void onTick(long millisUntilFinished) {
						Log.d(LOG_TAG, "onTick, waiting");
						// TODO Auto-generated method stub
						Toast.makeText(getApplicationContext(), "Ожидание", Toast.LENGTH_SHORT).show();
						/*mtext.setText("до silent " +millisUntilFinished/60000);*/
					}
		        }
		    	
		    	if (rhour>fromh||rhour==fromh&&rmin>from)
				 {
					 Log.d(LOG_TAG, "end");
					   AudioManager audiomanager = (AudioManager) getBaseContext()
				        		.getSystemService(Context.AUDIO_SERVICE);
				        audiomanager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
					int end = ((toh - rhour - 1)*60 + (60 - rmin + to))*60000;
					 MyCount counter = new MyCount(end,60000);
				        counter.start();
				 } else
				 {
					 
					 int waiting = ((fromh-rhour-1)*60 + (60 - rmin + from))*60000;
					 Log.d(LOG_TAG, "waiting" + waiting/60000);
					 checktime timer1 = new checktime (waiting,60000);
					 timer1.start();
					 /*rmin = c.get(Calendar.MINUTE);*/
				 }
		}
Логи:
08-24 18:41:05.537: D/ALogs(679): onCreate
08-24 18:41:05.548: D/ALogs(679): onStartCommand
08-24 18:41:05.557: D/ALogs(679): MyRun#1 create
08-24 18:41:05.628: D/ALogs(679): MyRun#1 start, time = 18 40 19 22 0 25
08-24 18:41:05.628: D/ALogs(679): main task
08-24 18:41:05.640: D/ALogs(679): waiting20
08-24 18:41:05.647: W/dalvikvm(679): threadid=9: thread exiting with uncaught exception (group=0x40015560)
08-24 18:41:05.667: E/AndroidRuntime(679): FATAL EXCEPTION: pool-1-thread-1
08-24 18:41:05.667: E/AndroidRuntime(679): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
08-24 18:41:05.667: E/AndroidRuntime(679): at android.os.Handler.<init>(Handler.java:121)
08-24 18:41:05.667: E/AndroidRuntime(679): at android.os.CountDownTimer$1.<init>(CountDownTimer.java:109)
08-24 18:41:05.667: E/AndroidRuntime(679): at android.os.CountDownTimer.<init>(CountDownTimer.java:109)
08-24 18:41:05.667: E/AndroidRuntime(679): at auto.answer.silent.Aservice$MyRun$1checktime.<init>(Aservice.java:94)
08-24 18:41:05.667: E/AndroidRuntime(679): at auto.answer.silent.Aservice$MyRun.run(Aservice.java:129)
08-24 18:41:05.667: E/AndroidRuntime(679): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
08-24 18:41:05.667: E/AndroidRuntime(679): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
08-24 18:41:05.667: E/AndroidRuntime(679): at java.lang.Thread.run(Thread.java:1019)

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: В сервисе перестал работать таймер

Сообщение Mikhail_dev » 25 авг 2012, 09:30

Вообще такая ошибка возникает потому что вы хотите изменить что-то в UI интерфейсе с другого потока. Я особо в коде ошибок не увидел на этот счет, но ошибка в том, что нельзя обращаться к интерфейсу с другого потока (именно вьюшки, кнопки и т.д.). Для обхода этого дела, используют handler

Sb_i
Сообщения: 3
Зарегистрирован: 24 авг 2012, 12:37

Re: В сервисе перестал работать таймер

Сообщение Sb_i » 27 авг 2012, 10:13

no-- писал(а):Вообще такая ошибка возникает потому что вы хотите изменить что-то в UI интерфейсе с другого потока. Я особо в коде ошибок не увидел на этот счет, но ошибка в том, что нельзя обращаться к интерфейсу с другого потока (именно вьюшки, кнопки и т.д.). Для обхода этого дела, используют handler
Спасибо, попробовала с handler и schedule, но все равно не получается. Handler не останавливается и делает все сразу (таймера, получается, нет). Пробовала делать schedule без handler - вылетает.
В общем, вариант с handler:

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

//собственно, сама runnable
protected void firsttimer(long waiting) {
		Log.d(LOG_TAG, "in schedule" + " waiting " + waiting/60000);
		Runnable tm = new Runnable () {
				public void run() {
		          Log.d(LOG_TAG, "run");
		          testing();
				     
		        }
		      };
		        h.postAtTime(tm, waiting);
		    }
	protected void testing () {
		  Log.d(LOG_TAG, "into testing");
		AudioManager audiomanager = (AudioManager) getBaseContext()
        		.getSystemService(Context.AUDIO_SERVICE);
        audiomanager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
	}
//вызывается в кнопке, просто вырезала ненужный код
firsttimer(waiting);
Вариант с shedule:

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

	protected void firsttimer(long waiting) {
		Log.d(LOG_TAG, "in schedule" + " waiting " + waiting/60000);
				tTask = new TimerTask() {
		        public void run() {
		          Log.d(LOG_TAG, "run");
		                AudioManager audiomanager = (AudioManager) getBaseContext()
		          		.getSystemService(Context.AUDIO_SERVICE);
		          audiomanager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
				       secondtimer(end);
				       tTask.cancel();
		        }
		      };
		      timer.schedule(tTask, waiting);
		       }
	public void secondtimer(int end){
				Log.d(LOG_TAG, "in schedule2");							
				 tTask1 = new TimerTask() {
				        public void run() {
				          Log.d(LOG_TAG, "run2");
				          AudioManager audiomanager = (AudioManager) getBaseContext()
					        		.getSystemService(Context.AUDIO_SERVICE);
					        audiomanager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
					     tTask1.cancel();
				        }
				      };
				      timer1.schedule(tTask1, end);		
		}
//вызывается так:
firsttimer(waiting);
В первом случае логи такие:
08-27 06:55:11.407: D/ALogs(495): onClick
08-27 06:55:11.448: D/ALogs(495): onCreate
08-27 06:55:11.457: D/ALogs(495): onStartCommand
08-27 06:55:11.457: D/ALogs(495): MyRun#1 create
08-27 06:55:11.487: D/ALogs(495): MyRun#1 start, time = 6 55 6 7 56 0
08-27 06:55:11.487: D/ALogs(495): main task
08-27 06:55:11.487: D/ALogs(495): waiting1end 4
08-27 06:55:11.487: D/ALogs(495): in schedule waiting 1
08-27 06:55:11.527: D/ALogs(495): run
08-27 06:55:11.527: D/ALogs(495): into testing
А во втором:
08-27 07:12:49.827: D/ALogs(530): onClick
08-27 07:12:49.877: D/ALogs(530): onCreate
08-27 07:12:49.887: D/ALogs(530): onStartCommand
08-27 07:12:49.887: D/ALogs(530): MyRun#1 create
08-27 07:12:49.929: D/ALogs(530): MyRun#1 start, time = 7 12 7 8 12 0
08-27 07:12:49.929: D/ALogs(530): main task
08-27 07:12:49.929: D/ALogs(530): end
08-27 07:12:49.937: D/ALogs(530): in schedule2
08-27 07:12:49.957: W/dalvikvm(530): threadid=9: thread exiting with uncaught exception (group=0x40015560)
08-27 07:12:49.997: E/AndroidRuntime(530): FATAL EXCEPTION: pool-1-thread-1
08-27 07:12:49.997: E/AndroidRuntime(530): java.lang.NullPointerException
08-27 07:12:49.997: E/AndroidRuntime(530): at auto.answer.silent.Aservice.secondtimer(Aservice.java:76)
08-27 07:12:49.997: E/AndroidRuntime(530): at auto.answer.silent.Aservice$MyRun.run(Aservice.java:182)
08-27 07:12:49.997: E/AndroidRuntime(530): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
08-27 07:12:49.997: E/AndroidRuntime(530): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
08-27 07:12:49.997: E/AndroidRuntime(530): at java.lang.Thread.run(Thread.java:1019)

Sb_i
Сообщения: 3
Зарегистрирован: 24 авг 2012, 12:37

Re: В сервисе перестал работать таймер

Сообщение Sb_i » 27 авг 2012, 16:00

Заработало без handler, тема закрыта, спасибо.

Закрыто