屏幕关闭时,线程会偶尔运行

时间:2015-11-21 13:20:20

标签: java android multithreading

我有一个工作线程,它在一个活动开始时开始运行。它通过调用回调来在屏幕打开时更新UI元素。现在,当应用程序在后台时,工作线程应继续工作。

但是,关闭屏幕后线程会变得不稳定。当屏幕打开时,线程会非常准确地执行其工作循环,但屏幕关闭时则不是这样。

我用于线程runnable的调试部分看起来像这样:

@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

这是零星的。首先它睡了将近7秒钟,然后在900毫秒内循环,然后再循环4秒......我如何让线程更加“平稳”地运行?工人应该相当准确,及时地工作。

1 个答案:

答案 0 :(得分:2)

我使用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"/>