2011-07-29 15 views
0

在我的android應用程序中,假設我有2個按鈕,第一個按鈕將啓動while循環,第二個按鈕將停止它,還有一個do_something()方法需要執行,連續不斷。可能的while循環在android中的實現

public void onCreate() { 
     my_var = true; 
     ok = (Button)findViewById(R.id.button1); 
     ok.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 


       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        while(my_var) do_something(); 
       } 

       return true; 
      } 
     }); 

     stop = (Button)findViewById(R.id.button2); 
     stop.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 


       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        my_var = false; 
       } 

       return true; 
      } 
     }); 

以下是導致我的應用程序和我的整個手機剛剛凍結。任何人都可以一目瞭然地告訴我做錯了嗎? aLogCat沒有給我太多的信息。 任何幫助將不勝感激!

+0

當您啓動應用程序或按下按鈕時它會凍結嗎? – tutts

回答

3

它凍結,因爲循環在UI線程上執行,並且UI無法處理事件來停止它。因此,它不能停止。你必須爲這種場合使用不同的線程。

3

你不能在UI線程上繼續處理,因爲在當前方法返回之前,android不能對UI線程進行任何新的調用來傳遞更多消息。

在這種情況下,您的while循環的退出只會發生在響應新的UI事件,在您結束while循環並返回之前無法傳遞。

2

您不能在UI線程上循環,因爲它不處理事件。你可以做的是做另一個意圖服務來做你想做的事。

而且,而是採用onTouch聽衆,你可以清理你的代碼,並在您的按鈕使用這個屬性:

android:onClick="onOkTouch" 

,然後在你的活動中,有這樣的:

public void onOkTouch(View v, MotionEvent event){ 
    ... 
} 
2

要避免可以實現,而在這樣的[參考文獻1]主題凍結UI線程:

public class MyThread extends Thread { 
    private volatile boolean m_bIsRunning= true; 

    public void stop() { 
     bIsRunning= false; 
    } 

    public void run() { 
     while (bIsRunning) { 
     do_something() 
     }  
    } 
} 

[R推理:this