我有一个工作线程,它在一个活动开始时开始运行。它通过调用回调来在屏幕打开时更新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秒......我如何让线程更加“平稳”地运行?工人应该相当准确,及时地工作。
答案 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"/>