2011年7月29日 星期五

[Android]倒數計時

因目前在寫遊戲,需要使用到"倒數計時器"。
所以參考了網路上文章,先做一個簡單的功能。
底下範例是 在TextView上顯示倒數30秒,歸零後停止倒數


Step1.定義一些物件


private Thread gameThread; //執行緒
private Boolean isGameThreadOver = true; //通知執行緒結束
private Handler handler = new Handler(); //Handler
private int iCntDown_Sec=30; //倒數秒數
private Boolean isCounDown = false; //開始倒數Flag
private TextView tv_CountDown;


Step2. 開始及結束函式...


/*******啟動執行緒*******/
private void gameStart()
{
  try
  {
       isGameThreadOver = false; 
       isCounDown = true;


       handler.post(gameRun);
       //runOnUiThread(gameRun);
  }
  catch(Exception ex)
  {
       Log.e("JB_TAG", "gameStart Error:"+ex.getMessage());
  }
}


/*******結束執行緒*******/
private void gameStop()
{
   try
  {
       isGameThreadOver = true;
       isCounDown = false;


       //停止runnable
       handler.removeCallbacks(gameRun);


       Log.v("JB_TAG", "遊戲結束!");
  }
  catch(Exception ex)
  {
       Log.e("JB_TAG", "無法成功結束,錯誤原因:"+ex.getMessage());
  }
}


/*******遊戲主迴圈*******/
Runnable gameRun = new Runnable() {
public void run()
{
try
{
      //當倒數秒數歸零後,停止thread
     if(iCntDown_Sec<=0) 
    { 
       gameStop(); 
    } 
    else 
    { 
       //每一秒作一次顯示 
       handler.postDelayed(this, 1000); 
        iCntDown_Sec--; 
        tv_CountDown.setText(Integer.toString(iCntDown_Sec)); 
     } 
 } 
 catch(Exception ex) 
 { 
     Log.e("JB_TAG", "Runnable執行錯誤 :"+ex.getMessage()); 
 } 
 } 
 }; 






Step3. OnCreate


public void onCreate(Bundle savedInstanceState)
{ gameStart(); }






PS.
因為是在MainThread以外的thread 改變UI,所以必須使用
-->handler.post(runnable);

-->runOnUiThread(runnable);


有興趣可以上網搜尋一下這兩者的詳細用法!!





參考網站 : 第1天: Minutes To Midnight

排程問題與CPU Scheduling

排程問題與CPU Scheduling

1. 先到先執行 (FCFS: First-Come, First-Served Scheduling)

2. 最短時間的工作先執行 (Shortest-Job-First Scheduling)

3. 循環執行(Round-Robin Scheduling)

參考文章:

http://mmdays.com/2007/09/28/cpu_scheduling/

http://tw.myblog.yahoo.com/star-888/article?mid=2879&sc=1