2

我有一個Service,它使用HandlerThread每5秒運行一些代碼。當我撥打stopSelf()時,服務似乎已停止,因爲從設備設置 - >應用程序 - >運行它不顯示在那裏。 但是線程內部的代碼每隔5秒就會持續運行,儘管我已經停止了該服務。
即使服務已停止,爲什麼HandlerThread仍然存在?當服務停止時,我如何停止HandlerThread服務器中的處理程序和線程繼續運行,而服務似乎已停止

final Handler h = new Handler(); 
final int delay = 5000; // milliseconds 

h.postDelayed(new Runnable() { 
     public void run() { 
      // do something 
      final SharedPreferences sharedPref = getSharedPreferences(
        getString(R.string.prefs), Context.MODE_PRIVATE); 
      if (sharedPref != null) { 

       new Thread(new Runnable() { 
        @Override 
        public void run() { 
         // SOME CODE 
         Log.d("UPDATING"," something here"); 
         isUpdated = updateToServer(data); 
         if(isUpdated) { 
          sharedPref.edit().putBoolean("updated",true).commit(); 
          stopSelf(); 
         } 
        } 
       }).start(); 
      } 
      h.postDelayed(this, delay); 
     } 
    }, delay); 
+0

中的onDestroy可以調用handler.removeCallBacks(可運行) – Ramesh 2015-02-11 10:53:16

回答

2

發佈Runnable之前,您應該驗證isUpdated,如果isUpdated==true,不要再發布,代碼如下:

final Handler h = new Handler(); 
final int delay = 5000; // milliseconds 

h.postDelayed(new Runnable() { 
     public void run() { 
      // do something 
      final SharedPreferences sharedPref = getSharedPreferences(
        getString(R.string.prefs), Context.MODE_PRIVATE); 
      if (sharedPref != null) { 

       new Thread(new Runnable() { 
        @Override 
        public void run() { 
         // SOME CODE 
         Log.d("UPDATING"," something here"); 
         isUpdated = updateToServer(data); 
         if(isUpdated) { 
          sharedPref.edit().putBoolean("updated",true).commit(); 
          stopSelf(); 
         } 
        } 
       }).start(); 
      } 
      if(!isUpdated){ 
       h.postDelayed(this, delay); 
      } 

     } 
    }, delay); 
+0

它很好用! – 2015-02-11 17:08:43

0

我想你必須在停止服務之前致電myHandler.getLooper().quit()

+0

你的意思我叫'h.getLooper()。退出()'只是調用'stopSelf前()'? – 2015-02-11 11:00:07

+0

@MohammedAli絕對。 – 2015-02-11 11:01:44

+0

這是導致崩潰!錯誤:'java.lang.RuntimeException:主線程不允許退出.' – 2015-02-11 15:44:23

1

正如其名,分別從服務的線程中運行,所以它不會只是停止通過停止服務。我沒有真正測試這段代碼,但它應該停止你的線程和處理程序,或者給你一個總體思路如何去做。

final Handler h = new Handler(); 
final int delay = 5000; // milliseconds 
private boolean isRunning = true; // a variable to signal stopping the thread 

h.postDelayed(new Runnable() { 
    public void run() { 
     // do something 
     final SharedPreferences sharedPref = getSharedPreferences(
       getString(R.string.prefs), Context.MODE_PRIVATE); 
     if (sharedPref != null) { 

      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        if (isRunning) { 
        // SOME CODE 
        Log.d("UPDATING"," something here"); 
        isUpdated = updateToServer(data); 
        if(isUpdated) { 
         sharedPref.edit().putBoolean("updated",true).commit(); 
         isRunning = false; // used to stop the thread from continuing the work 
         h.removeCallbacks(this); // stopping handler ("this" is the handler runnable you are stopping) 
         stopSelf(); 
        } 
        } 
       } 
      }).start(); 
     } 
     h.postDelayed(this, delay); 
    } 
}, delay); 

希望這有助於你...

+0

我還沒有嘗試過這種方式,但看起來這也可能起作用。 – 2015-02-12 17:47:54

相關問題