Я провожу тесты на HTC Magic (телефон для разработчиков 2). У меня есть 3 фоновых AsyncTasks. Один загружает данные с сервера, один пробуждает экран раз в минуту, а последний поддерживает работу приложения в течение заданного времени. Асинтаск потока загрузки, кажется, работает правильно, и пока он загружается (~ 1 час), другие два, похоже, тоже работают. Но как только загрузка завершена, если телефон отключен, два других потока не работают должным образом (экран не просыпается, и KeepAlive никогда не заканчивается). Кажется, что они полностью останавливаются, затем, если я подключаю телефон к компьютеру, они снова запускаются ... Я не уверен, что может быть причиной этого, пробуждение экрана должно препятствовать переходу устройства в спящий режим.
Весь мой код можно найти здесь: https://homepage.usask.ca/~mcb394/Receive.java или два класса, которые перестают работать после завершения загрузки и при отключении от сети, приведены ниже. Любые мысли были бы потрясающими.
/**
* This class keeps the phone alive for the entire duration necessary to use all the data (think of a media player buffer)
* @author michael bullock
*/
private class KeepRunning extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
try {
Thread.sleep(ALIVE_TIME_MS);
} catch (InterruptedException e) {
out.print(" KeepRunning Crashed!!!!!\n");
out.flush();
e.printStackTrace();
}
out.print(" KeepRunning Completed\n");
out.flush();
timeCompleted = true;
return null;
}
}
/**
* This class powers the phone's screen up every WAKEUP_EVERY ms, stays awake for 1s
* This is so the phone avoids going to sleep
* @author michael bullock
*/
private class WakeUp extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, getClass().getName());
do{
try {
Thread.sleep(WAKEUP_EVERY);
} catch (InterruptedException e) {
e.printStackTrace();
}
wl.acquire();
Log.i("", "********** Acquired Wakelock **********");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("", "********** Releasing Wakelock **********");
wl.release();
}while(!timeCompleted || !transferCompleted);
out.print(" WakeUp Completed\n");
out.flush();
return null;
}
}