2015-03-11 24 views
20

Mam usługę, która powinna działać w tle. Zaczyna się, gdy moja aplikacja jest otwarta, i kończy się za każdym razem, gdy moja aplikacja zostanie wyłączona przez użytkownika.Funkcja WakeLock sfinalizowana, mimo że nadal występuje błąd, mimo że ją zwalniam.

Zawsze, gdy moja aplikacja jest w tle lub gdy ekran jest wyłączony, nadal potrzebuję usługi.

Osiągnąłem to dzięki WakeLock, ale z jakiegoś powodu dostaję błąd w tytule.

Jest to niepokojące, ponieważ mogę być przyczyną wycieku pamięci WakeLock (jeśli dobrze rozumiem).

Jestem w stanie wyzwolić błąd, ponownie uruchamiając moją aplikację.

Oto odpowiedni kod:

public class SomeService extends Service { 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 

     PowerManager manager = (PowerManager) getSystemService(POWER_SERVICE); 

     mWakeLock = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TAG"); 

     if (!mWakeLock.isHeld()) mWakeLock.acquire(); 

     //Handle other processing 

     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 

     if (mWakeLock.isHeld()) mWakeLock.release(); 
     super.onDestroy(); 
    } 

} 

Jestem zakłopotany, ponieważ w moim onDestroy() I zwolnić blokada wybudzenia. Nie jestem pewien, co powoduje błąd.

+1

Mam również ten sam problem. Więc znalazłeś jakieś rozwiązanie? –

+1

Czy próbowałeś przenieść tworzenie blokady do 'onCreate()'? – iosdude

+0

@iosdude Próbowałem, ale to jest to samo. – Pitel

Odpowiedz

6

Service.onStartCommand() może być wywołana kilka razy przed Service.onDestroy(), ponieważ nie reprezentują one "przeciwnych" zdarzeń/stanów (patrz docs). Możesz zdobyć kilka zamków (i za każdym razem utracić odniesienie do poprzedniej zdobytej blokady), ale kiedy skończysz obsługę/zamkniesz aplikację, zwalniasz tylko ostatnią.

+0

Ale co mam uzyskać wakelock w metodzie 'OnCreate()'? Właśnie to robię, ale wciąż dostaję błąd. – Pitel

+0

@Pitel, czy możesz opublikować swój kod? (chociaż może być konieczne utworzenie nowego pytania, ponieważ jest to prawdopodobnie powiązany, ale inny problem): –

+0

Oto mój kod: http://pastebin.com/zQTBuvaw – Pitel