2013-10-14 3 views
1

Я использую wakelock для тревоги, чтобы регулярно обновлять состояние приложения. Wi-Fi занимает некоторое время, чтобы подключиться к телефонам Samsung. Также опция «keep awake» на Wifi не работает на телефонах Samsung (nor are they interested in fixing the issue). Поэтому, когда wakelock действительно произойдет, он должен ждать подключения Wi-Fi. Нужно ли мне создавать слушатель для подключения Wi-Fi для этого, или нужен wakelock, какой-то блок для подключения Wi-Fi?wakeLock не ждет подключения к сети

mWakeLock = ((PowerManager) getSystemService(POWER_SERVICE)).newWakeLock(
      PowerManager.PARTIAL_WAKE_LOCK, "Taxeeta"); 
    mWakeLock.acquire(); 
// do some network activity, in a asynctask 
// in the doPost of asyscTask, release lock 

Edit: Вопрос в том, что в AsyncTask, если сеть не подключена, или требуется время, чтобы попасть на (3g требуется некоторое время, чтобы попасть на), то вебсервис вызов в асинхронным doInBackground потерпит неудачу , И мне все равно придется выпустить замок.

SO

Должен ли я поставить в WiFi/подключения к данным слушателей в? Или есть лучший способ?

+0

Почему «wakeLock ждет подключения к сети»? Вы должны держать wakelock и следить за тем, чтобы вы держали его во время подключения к сети. Отправьте больше своего дизайна, чтобы получить правильный ответ. –

+0

Вы решили вы r проблема? –

ответ

1

У меня есть подобный сценарий - я проснулся от тревоги, the alarm's BroadcastReceiver запускает WakefulIntentService и служба начинает сканирование сетей. I use a stupid way of holding on to the lock - Я намерен заменить это защелкой. Я предлагаю вам заменить «AsyncTask» на WakefulIntentService. Скорее всего, AsyncTask никогда не срабатывает. В WakefulIntentService вы должны приобрести и удерживать замок Wi-Fi - я бы сделал это статическим полем YourWakefulIntentService - это не совсем понятно, это время назад. Если это не работает, я хотел бы использовать защелку в YourWakefulIntentService:

// register an alarm 
Intent i = new Intent(context, YourReceiver.class); 
PendingIntent alarmPendingIntent= PendingIntent.getBroadcast(context, 0, i, 
      PendingIntent.FLAG_UPDATE_CURRENT); 

public class YourReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     WakefulIntentService.sendWakefulWork(context, YourWIS.class); 
    } 
} 

//pseudocode ! 
public class YourWIS extends WakefulIntentService { // you must add a cstor ! 

    @Override 
    doWakefulWork() { 
     acquireWifiLock(); 
     enableScanReceiver(); 
     startScan(); 
     serviceLatch.wait(); 
     releaseWifiLock(); 
    } 
} 

// in YourScanReceiver 
onReceive() { 
    if(action.equals(SCAN_RESULTS) { 
    // do something that does not take time or start another/the same 
    // WakefulIntentService 
    serviceLatch.notify(); 
    } 
} 

Попробуйте сначала WakefulIntentService (я предполагаю, что вы запускаете AsyncTask от приемника сигнала тревоги). Приемник сканирования является получателем, зарегистрированным для получения результатов сканирования (см. Документы WifiManager - предпочитают приемники для слушателей для проблем со сном)

1: Это рабочий класс. Я просто использую вторую услугу бодрствования, чтобы сохранить след. блокировки - по-прежнему реорганизовать его на использование защелок, но этот подход по крайней мере работает (у меня есть вторая услуга (Gatekeeper), ожидающая на мониторе и имеющая блокировку слежения внутри Gatekeeper. Привратник также имеет блокировку процессора, поэтому все в порядке (и уродливый)

+0

Это очень полезно, можете ли вы разработать и поделиться больше кода. Я не знаю, что такое scanreceiver. Im читает countdownlatch. – taxeeta

+0

Хорошо, понял защелку, просто. Переход к WakefulIntentService – taxeeta

Смежные вопросы