В активити все нормально работало, проблем с таймерами (их два) не возникало. Как только код был перемещен в сервис (все нужные данные сервису тоже переданы), приложение стало вылетать с ошибкой: "Произошла неожиданная остановка приложения 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));
}Код: Выделить всё
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)
