2011-07-31 35 views
0

所以在我進一步努力以實現Android的while循環我想出了下面的代碼:主題-while環 - [Android]產品

private boolean connected = false; 
private Thread loop = new Thread() { 
    public void run() { 
     Looper.prepare(); 
     while (connected) { 
      do_Something(); 
     } 
     Looper.loop(); 
    } 
}; 

onCreate() { 
    //..... 
    ok = (Button) findViewById(R.id.button1); 
    ok.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (connected) { 
       try { 
        loop.start(); 
       } 
       catch (Exception e) { 
        Toast.makeText(getBaseContext(), "Exception caught", Toast.LENGTH_LONG).show(); 
       } 
      } 
      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) { 
       //disconnects current connection 
       connected = false; 
      } 
      return true; 
     } 
    }); 
} 

也就是說,我試圖在觸摸第一個按鈕將我的UI線程切換到線程,該線程一次又一次地do_something,直到觸摸第二個按鈕,在這種情況下,布爾var k將關閉,並完全停止新創建的線程從第一個按鈕按下按鈕。我google'd「線程/處理程序/ android while循環」但無濟於事。任何幫助,我想要做什麼將不勝感激

簡而言之,我如何殺死通過按第二個按鈕創建的線程?

+0

你知道我認爲你已經結束了這個,你真正想要的是一個計時器。 – Tom

+0

您必須將'connected'聲明爲'volatile' - 否則可能在您創建的線程中看不到變化 –

回答

1

您是否試過AsyncTask?你可以做什麼...在firstButton上單擊開始一個新的AsyncTask並在secondButton單擊上取消它。

//define global variable 
private DoSomething doSomething; 

//register firstButton onClickListener 
firstButton.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View arg0) { 
     //start your asynctask 
     if(doSomething == null || doSomething.isCancelled()){ 
      doSomething = new DoSomething(); 
      doSomething = doSomething.execute(); 
     } 
    } 
}); 

//register secondButton onClickListener 
secondButton.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View arg0) { 
     doSomething.cancel(); 
    } 
}); 

//Inner AsyncTask class 
class DoSomething extends AsyncTask<Void, Void, Void>{ 
    @Override 
    protected Void doInBackground(Void... params) { 
     //doSomething(); 
     while(true){ 
      System.out.println(1); 
      if(isCancelled()){ 
       break; 
      } 
     } 
     return null; 
    } 
} 

注意:這是僞代碼...可能包含錯誤...只是想給你概述。希望這個幫助。

+0

嘿gopal,感謝異步建議,只是一個簡單問題,如果我在while循環doSomething()中doInBackground (),會調用doSomething.cancel()在第二個按鈕的點擊監聽器上取消它嗎?或者.execute()會一遍又一遍地doSomething doInBackground? –

+0

@kevin更新了我的代碼...檢查doInBackground方法和firstButton onClick方法...希望這會回答你的問題...僅供參考:我試過這個,它工作正常。仍然有任何問題讓我知道。 – Gopal