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

Я провожу тесты на 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;
    }
}

person Michael    schedule 03.03.2011    source источник
comment
Обновление: я поместил в свой код несколько операторов журнала с отметками времени, и вот что я нашел... класс WakeUp, который должен пробуждать экран каждую минуту, работает до завершения загрузки. Как только сетевая активность прекращается, он начинает пробуждать экран каждые 10 минут, а не 1 минуту. Я разбил свой другой поток KeepRunning на более мелкие сны, и он показал аналогичные результаты. Очень странно.   -  person Michael    schedule 04.03.2011


Ответы (1)


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

person jakebasile    schedule 04.03.2011
comment
Я не верю, что активность умирает, я добавил несколько операторов журнала с отметками времени, чтобы попытаться получить четкое представление о том, что происходит, и, похоже, это просто 10-кратное замедление при отключении. - person Michael; 04.03.2011
comment
Я также только что заметил, что вы получаете wakelock на несколько мс, а затем отказываетесь от него. Попробуйте получить wakelock на все время загрузки. Вам также может понадобиться только блокировка процессора. - person jakebasile; 04.03.2011
comment
Да, wakelock предназначен для того, чтобы устройство не переходило в спящий режим и не разрушало мои сетевые подключения. Причина, по которой я получаю его ненадолго каждую минуту, заключается в том, что кажется, что 802.11 PSM отключается, когда экран включен, и мои тесты полагаются на PSM. Я попробую запустить его с включенной блокировкой процессора только на протяжении всего времени и посмотрю, что произойдет. Спасибо за совет. - person Michael; 04.03.2011
comment
Для обновления - если я использую экран wakelock для всего теста, тест проходит, но не PSM. Если я использую блокировку пробуждения ЦП (частично) в течение всего времени ожидания моих сетевых подключений, и приложение выдает исключение. - person Michael; 04.03.2011
comment
Вроде. Он работает, но не в том состоянии, в котором я хочу. Он работает, когда экран включен. Мне нужно запустить его с выключенным экраном, чтобы я мог воспользоваться преимуществами Wi-Fi-радио, которое уходит в сон. Когда экран выключен, а не просыпается каждую минуту, как должен, он просыпается каждые 10 минут. - person Michael; 06.03.2011
comment
Странно, что использование PARTIAL_WAKE_LOCK останавливает ваш код. Другой подход, который вы можете попробовать, - использовать AlarmManager, как показано в этом вопросе: stackoverflow.com/questions/3233764/ - person jakebasile; 06.03.2011
comment
@Michael: Откуда у вас информация о том, что 802.11 PSM отключен? Меня это интересует. - person mreichelt; 01.04.2011