2013-03-11 164 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