2011-11-22 91 views
1

我剛剛在Android上開始了一個簡單的線程處理程序。代碼起作用。唯一的部分是如何關閉處理程序。我試圖關閉處理程序onPause(),但它只是繼續運行。有什麼建議麼?如何在Android中停止線程處理程序?

下面是代碼: 我的主要活動主題:

package com.test.prog; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.widget.TextView; 

public class AndroidThreadProgv1Activity extends Activity { 

    private Handler DataHandler; 

    private DataUpdater du; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.main); 

     /* Initialize handler to allow UI updating in other threads */ 
     DataHandler = new Handler(); 

     startDataUpdater(); 

    } 

    public void onPause(){ 
     super.onPause(); 
     du.stopConnection(); 
    } 

    private void startDataUpdater(){ 
     System.out.println("In startDataUpdater"); 
     du = new DataUpdater(DataHandler,(TextView) findViewById(R.id.textView1)); 
     du.start(); 
    } 

} 

DataUpdater.java:

package com.test.prog; 

import java.io.IOException; 
import android.os.Handler; 
import android.os.Looper; 
import android.widget.TextView; 

/* 
* Data updater thread. Updates the display with the response. 
*/ 
public class DataUpdater extends Thread{ 

    /*Handler for the UI update*/ 
    private Handler dataRefreshHandler; 

    /*The UI text displaying the data*/ 
    private TextView dataLabel; 

    /*data value*/ 
    private int data = 0; 
    /*data update rate in ms*/ 
    private static final int dataUpdateRate = 2000; 

    private boolean stoppedFlag= false; 

    public DataUpdater(Handler handler, TextView tv){ 
     this.dataRefreshHandler = handler; 
     this.dataLabel = tv; 
    } 


    public void stopConnection() 
    { 
     if(this.dataRefreshHandler != null) { 
      this.dataRefreshHandler.removeMessages(data); // Remove a delayed message 
      System.out.println("In stopConnection"); 
      /* 
      if(!stoppedFlag){ 
       this.dataRefreshHandler.getLooper().quit(); // Warning 
       stoppedFlag = true; 
      } 
      */ 
     } 
    } 


    @Override 
    public void run(){ 
     try { 
      while(true){ 
       System.out.println("In run"); 
       data = data + 1;   
       updateData();    
       Thread.sleep(dataUpdateRate); 
      } 

     } 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    }  
    /* 
    * Calls the UI Handler and updates the display 
    */ 
    private void updateData(){ 
     dataRefreshHandler.post(new Runnable() { 
      public void run() { 
       if(data==0) 
       { 
        dataLabel.setText("Value not known"); 
       } 
       else 
       { 
        System.out.println("In update"); 
        dataLabel.setText("Value="+data); 

       } 
      } 
     }); 
    } 
} 
+0

如何使用'runOnUiThread()'而不是創建一個Handler? – Dalmas

回答

2

在dataUpdater你 「跑」 的方法有while(true)循環。你永遠不會檢查任何退出條件,所以它永遠不會停止。你可以做的是在DataUpdater中包含一個volatile標誌(初始設置爲true)並且stopConnection將其設置爲false。您在run中的while循環可以檢查該標誌,而不是僅僅循環無限。

爲了確保只要您的活動運行的DataUpdater運行:

移動從onCreate調用startDataUpdater();onResume(安卓始終的onCreate後調用的onResume所以這將確保你總是在創建調用startDataUpdater爲以及暫停後重新開始)。

更改您的run方法在DataUpdater看起來像這樣:

public void run(){ 
    isRunning = true; // isRunning should be declared as a "private volatile boolean" 
    try { 
     while(isRunning){ 
      System.out.println("In run"); 
      data = data + 1;   
      updateData();    
      Thread.sleep(dataUpdateRate); 
     } 
    } 
+0

這畢竟是微不足道的:)謝謝!我用dataRefreshHandler.getLooper()打破了我的頭,用Looper退出()但以某種方式轟炸了 – user489152

+0

我無法通過設置標誌提示重新啓動更新過程:( – user489152

+0

一旦你停止它,while循環終止,因爲run()返回,線程終止,重新啓動它,你需要通過thread.start()重新啓動一個新的線程(如果你正在重用相同的DataUpdater實例,不要忘記設置標誌變回true ...例如你可以在run方法的第一行執行此操作) – Chris

2

您可以進行活套的用戶,而不是使用一段時間(1),這是CPU霸佔。 對於循環回來,您可以將消息發回到循環中的相同處理程序。 對於停止時,您只需將可運行的run()方法中的runnable Looper.myLooper.stop()發佈到活套。

Looper比While(true)更有效

+0

當我嘗試:\t Looper.prepare(); \t \t this.dataRefreshHandler = handler; \t \t Looper.loop();它崩潰:( – user489152