2015-11-21 4 views
1

У меня есть рабочий поток, который запускается при запуске действия. Он обновляет элементы пользовательского интерфейса, когда экран включен, вызывая обратный вызов. Теперь, когда приложение находится в фоновом режиме, рабочий поток должен продолжать работать.Поток проходит спорадически, когда экран выключен

Однако нить становится неуклюжей после выключения экрана. Когда экран включен, поток выполняет свой рабочий цикл довольно точно, но это не тот случай, когда экран выключен.

отладки часть я использую для потока работоспособной выглядит примерно так:

@Override 
public void run() 
{ 
    while(mRunning) 
    { 
     Log.i(TAG, "Tick"); 
     try 
     { 
      Thread.sleep(1000); 
     } 
     catch(InterruptedException e) 
     { 
      mRunning = false; 
     } 
    } 
} 

Когда я запускаю это в то время как экран включен, выход LogCat является довольно последовательным:

11-21 15:15:18.022 1424-2260/com.manabreak.threadedtest I/Worker: Tick 
11-21 15:15:19.031 1424-2260/com.manabreak.threadedtest I/Worker: Tick 
11-21 15:15:20.030 1424-2260/com.manabreak.threadedtest I/Worker: Tick 
11-21 15:15:21.031 1424-2260/com.manabreak.threadedtest I/Worker: Tick 
11-21 15:15:22.037 1424-2260/com.manabreak.threadedtest I/Worker: Tick 

Как вы можете видеть, это довольно точно и остается там около 1000 мс. Однако, когда экран выключен, выход становится действительно случайным:

11-21 15:16:22.002 1424-2260/com.manabreak.threadedtest I/Worker: Tick 
11-21 15:16:28.781 1424-2260/com.manabreak.threadedtest I/Worker: Tick 
11-21 15:16:29.646 1424-2260/com.manabreak.threadedtest I/Worker: Tick 
11-21 15:16:33.619 1424-2260/com.manabreak.threadedtest I/Worker: Tick 
11-21 15:16:38.497 1424-2260/com.manabreak.threadedtest I/Worker: Tick 

Это намного более спорадический. Сначала он спит почти семь секунд, затем цикл в 900 мс, затем снова четыре секунды ... Как сохранить поток «более плавным»? Работник должен работать довольно аккуратно и своевременно.

+1

Возможно, вам следует рассмотреть возможность сделать это в службу вместо Тема. Он лучше подходит для платформы Android. –

ответ

0

Я решил это, используя PARTIAL_WAKE_LOCK:

private WakeLock mWakeLock; 

// Activity's onCreate() 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    ... 
    PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE); 
    mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "worker"); 
    ... 

    // The worker thread 
    Thread t = new Thread(mRunnable); 
    t.start(); 
} 

@Override 
protected void onPause() 
{ 
    super.onPause(); 
    mWakeLock.acquire(); 
} 

@Override 
protected void onResume() 
{ 
    super.onResume(); 
    if(mWakeLock.isHeld()) mWakeLock.release(); 
} 

Если вы сделаете это, не забудьте добавить разрешения на манифест:

<uses-permission android:name="android.permission.WAKE_LOCK"/>