1

我有一项服务,只要屏幕打开就会运行。当我让手机进入睡眠状态时,服务和线程应该停止。

我设法停止了服务,但线程仍在运行。我怎样才能杀死线程?

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();
4

2 回答 2

1

您可以Thread使用一个共享变量来停止 a,该变量充当一个标志来要求Thread停止。例如,在您的 external中Thread,声明private volatile boolean mRunning = true并将 tn the outer 更改while(true)while(mRunning)。然后实现一个方法来请求它停止运行:

public void terminate() {
    mRunning = false;
}
于 2013-03-11T18:53:15.687 回答
0

我没有完全理解你的问题,因为答案似乎很简单,除非我遗漏了一些东西。

在您的示例中停止线程似乎就像调用一样简单return;,这将结束public void run()方法并结束线程。

      ....
                       if (!screenIsOn) {
                            Log.i(TAG ,"Screen is OFF, stopping service");
                            stopSelf();
                            return;
                        }
      ....

OP评论后更新:

如果你没有使用 anAlarmManager并且你可以确定你的线程仍然接收一些 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();
于 2013-03-11T19:32:06.600 回答