Android-устройство ведет себя по-разному, когда подключен к USB и не подключен - PullRequest
2 голосов
/ 04 марта 2011

Я запускаю тесты на HTC Magic (телефон Dev 2). У меня есть 3 фоновых AsyncTasks. Один загружает данные с сервера, один пробуждает экран раз в минуту, а последний поддерживает приложение в течение заданного времени. Asynctask потока загрузки, кажется, работает правильно, и в то время как это загружает (~ 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;
    }
}

1 Ответ

1 голос
/ 04 марта 2011

Служба или действие, выполняющее этот AsyncTask, может быть убито, что может зависеть от заряда аккумулятора.Попробуйте воспользоваться услугой и использовать Service.startForeground.

...