我有一个服务,只要屏幕开启就会运行,当我输入手机进入睡眠状态时,服务和线程应该停止
我设法停止服务,但线程仍在运行,我怎么能杀死线程?
void runAppCheck(){
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(10000);
mHandler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
getForegroundApplication();
compareResults();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean screenIsOn = pm.isScreenOn();
if (!screenIsOn) {
Log.i(TAG ,"Screen is OFF, stopping service");
stopSelf();
//TODO stop thread
}
}
});
} catch (Exception e) {
// TODO: handle exception
}
}
}
}).start();
答案 0 :(得分:1)
您可以使用充当标志的共享变量来停止Thread
,以要求Thread
停止。例如,在您的外部Thread
中,声明private volatile boolean mRunning = true
并将外部while(true)
更改为while(mRunning)
。然后实现一个方法来请求它停止运行:
public void terminate() {
mRunning = false;
}
答案 1 :(得分:0)
我没有完全解决你的问题,因为答案看起来很容易,除非我遗漏了什么。
在示例中停止线程似乎就像调用return;
一样简单,这将结束public void run()
方法并且将结束线程。
....
if (!screenIsOn) {
Log.i(TAG ,"Screen is OFF, stopping service");
stopSelf();
return;
}
....
OP评论后更新:
如果您没有使用AlarmManager
,并且可以确定您的线程仍然会收到一些CPU周期,那么为什么要进行mHandler.post(....)
调用?为什么不跳过post
来电。
void runAppCheck(){
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(10000);
// TODO Auto-generated method stub
getForegroundApplication();
compareResults();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean screenIsOn = pm.isScreenOn();
if (!screenIsOn) {
Log.i(TAG ,"Screen is OFF, stopping service");
stopSelf();
//stop thread
return;
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
}).start();