Я использовал postDelayed для задержки динамической продолжительности. И я нашел, что это работает неправильно. Вот мой исходный код.PostDelayed не работает правильно
public Runnable service = new Runnable() {
public void run() {
endTimeHere = System.currentTimeMillis();
Log.d("Time",(endTimeHere-startTimeHere)/1000);
switch (step)
{
case 0:
delay = 0;
step = 1;
break;
case 1:
delay = 600; //delay 10 min = 600 sec
step = 2;
break;
case 2:
delay = 1200; //delay 20 min = 1200 sec
step = 3;
break;
case 3:
delay = 1800; //delay 30 min = 1800 secs
step = 0;
break;
default:
break;
}
startTimeHere = System.currentTimeMillis();
handler.postDelayed(service, delay*1000);
}
};
И начинаю и останавливаю обработчик в BroadcastLintener.
public Handler handler = new Handler();
private BroadcastReceiver screenReceiver = new BroadcastReceiver()
{
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
if(Intent.ACTION_SCREEN_ON.equals(action))
{
handler.removeCallbacks(service);
}
else if(Intent.ACTION_SCREEN_OFF.equals(action))
{
handler.post(service);
}
}
}
Я уверен, что postDelayed добавляется в очередь, потому что возвращаемое значение истинно. Однако время, которое я записал, не соответствует заданному значению задержки. Например, я установил задержку = 600 секунд и записанную продолжительность = 958 секунд.
Кто-нибудь знает, почему это произошло?
Вы пробовали этот код с частичным wakelock? – marcinj
Нет. Это связано? – iscnorthwind
стоит попробовать, устройство migt должно спать после ACTION_SCREEN_OFF – marcinj