如何杀死服务中的线程?
我有一个运行时的屏幕被打开,当我iput手机睡觉的服务,服务和线程应该停止如何杀死服务中的线程?
我设法停止服务,但线程仍在运行,我该怎么杀死线程?
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();
我并不完全让你的问题,因为答案似乎很容易,除非我失去了一些东西。
在你的例子中停止你的线程似乎很容易调用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();
顺便说一句:在一个线程中这样做是一个糟糕的设计,因为当你的屏幕关闭时,你的线程可能不会得到任何CPU时间,如果它不运行,它不能检测到屏幕关闭或打开...使用AlarmManager来处理这些情况:http://developer.android.com/reference/android/app/AlarmManager.html – 2013-03-11 19:33:54
不幸的是,它不工作,线程仍在运行。 线程正在运行,即使屏幕关闭,即使它没有它会好,因为我希望它停止时,屏幕关闭 – DoubleP90 2013-03-11 19:40:03
我错过了事实,你发布另一个Runnable到ui线程,所以调用RET瓮;将无法工作。不过,改为使用AlarmManager。 – 2013-03-11 19:41:17
您可以通过使用共享变量,作为一个标志问Thread
停止停止Thread
。例如,在您的外部Thread
中,声明private volatile boolean mRunning = true
并将外部while(true)
更改为while(mRunning)
。然后实现的方法,要求其停止运行:
public void terminate() {
mRunning = false;
}
我不能分配共享变量到我的线程,我试过Thread mRunning = new Thread(new Runnable(){..但它给了我一个错误 – DoubleP90 2013-03-11 19:19:31
你可以,你只是不知道如何... – WarrenFaith 2013-03-11 19:36:52
可以你告诉我怎么样? – DoubleP90 2013-03-11 19:41:53
如何正确地停止Java线程已经讨论过很多次,尤其是在StackOverflow上。为什么您在搜索时找到的任何解决方案都不够? – Trevor 2013-03-11 18:37:53
因此,如果手机屏幕关闭,这段代码每隔10秒看一次? – 2013-03-11 18:38:01
我找到的解决方案不起作用,其中一个已被弃用,而.interrupt()给了我错误。 否代码会检查每10秒在前台运行的应用程序。 – DoubleP90 2013-03-11 18:41:36