2013-03-11 167 views
1

我有一个运行时的屏幕被打开,当我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(); 
+0

如何正确地停止Java线程已经讨论过很多次,尤其是在StackOverflow上。为什么您在搜索时找到的任何解决方案都不够? – Trevor 2013-03-11 18:37:53

+0

因此,如果手机屏幕关闭,这段代码每隔10秒看一次? – 2013-03-11 18:38:01

+0

我找到的解决方案不起作用,其中一个已被弃用,而.interrupt()给了我错误。 否代码会检查每10秒在前台运行的应用程序。 – DoubleP90 2013-03-11 18:41:36

回答

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(); 
+0

顺便说一句:在一个线程中这样做是一个糟糕的设计,因为当你的屏幕关闭时,你的线程可能不会得到任何CPU时间,如果它不运行,它不能检测到屏幕关闭或打开...使用AlarmManager来处理这些情况:http://developer.android.com/reference/android/app/AlarmManager.html – 2013-03-11 19:33:54

+0

不幸的是,它不工作,线程仍在运行。 线程正在运行,即使屏幕关闭,即使它没有它会好,因为我希望它停止时,屏幕关闭 – DoubleP90 2013-03-11 19:40:03

+0

我错过了事实,你发布另一个Runnable到ui线程,所以调用RET瓮;将无法工作。不过,改为使用AlarmManager。 – 2013-03-11 19:41:17

1

您可以通过使用共享变量,作为一个标志问Thread停止停止Thread。例如,在您的外部Thread中,声明private volatile boolean mRunning = true并将外部while(true)更改为while(mRunning)。然后实现的方法,要求其停止运行:

public void terminate() { 
    mRunning = false; 
} 
+0

我不能分配共享变量到我的线程,我试过Thread mRunning = new Thread(new Runnable(){..但它给了我一个错误 – DoubleP90 2013-03-11 19:19:31

+0

你可以,你只是不知道如何... – WarrenFaith 2013-03-11 19:36:52

+0

可以你告诉我怎么样? – DoubleP90 2013-03-11 19:41:53