2011-09-14 59 views
0

線程:如何正確停止「繪圖」螺紋

public class DrawThread extends Thread { 
    private RMapCanvas canvas; 
    final Handler myHandler = new Handler(); 
    final ArrayList<RGroupMapLayer> layers; 

    public DrawThread(RMapCanvas aCanvas, ArrayList<RGroupMapLayer> arrayOfLayers) 
    { 
     canvas = aCanvas; 
     layers = arrayOfLayers; 
    } 

    public void run() { 
     activity.RaiseNotification(activity.getApplicationContext().getResources().getString(R.string.loading).toString()); 
     for (RGroupMapLayer l : layers) 
      { 
       l.validateAndRepairView(false, canvas.renderer, canvas.mapView); 
       l.render(canvas.renderer, canvas.mapView, canvas.mapEvent, 5000000, 5000000); 
       if (settings.getPositionFeature() != null) 
       { 
        RPointFeatureStyle positionStyle = new RPointFeatureStyle(RPointFeatureStyle.SIMPLE_POINT_STYLE_GPS); 
        positionStyle.render(settings.getPositionFeature(), renderer, mapView); 
       } 
       myHandler.post(new Runnable() { 
        @Override 
        public void run() { 
         canvas.RenderComplete(); 
        }}); 
      } 
    activity.statusMessage.cancel(); 
    } 

    public synchronized void requestStop() { 
     activity.statusMessage.cancel(); 
     this.interrupt(); 
    } 
} 

調用它中斷一個線程是不夠的requestStop。線程只是繼續運行。有人可以更新代碼以顯示停止此線程的正確方法嗎?順便說一下... RenderComplete()方法更新UI(在我的情況下,女巫是一個問題,因爲即使新的啓動器和舊的代碼中斷,「舊」線程也會不斷更新UI)。

Thanx提前。

回答

2

通常不推薦自行中斷或停止線程。你的線程應該在run方法中有一個標誌。當標誌爲true - 線程正在運行時,當標誌爲false - 線程也在運行,但現在它什麼都不做。系統會在需要時停止該線程。下面是它應該是什麼樣子:

public void run() { 
     while (flag) { 
     //do your work 
     } 
    } 

和「停止」線程只是使用flag = false;

希望這有助於。

+0

整個故事並不安靜,你需要確保'flag'在這種情況下是不穩定的。首選的方法是使用(內部)中斷標誌...所以while(!Thread.currentThread()。isInterruptted()) – Toby

+0

@Toby,這不是一個好方法來自己中斷線程,也不停止或暫停它。 – Egor