Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 安卓開發定時線程實例

安卓開發定時線程實例

編輯:關於android開發

  安卓開發定時線程實例,主要結構代碼如下:

  public class ThreadTestActivity extends Activity {

  /** Called when the activity is first created. */

  public Handler mHandler = new Handler(){

  @Override

  public void handleMessage(Message msg) {

  // TODO Auto-generated method stub

  switch(msg.what) {

  case 1:

  System.out.println("Handler --> ID IS " + Thread.currentThread().getId());//Handler處於UI線程中

  break;

  }

  super.handleMessage(msg);

  }

  };

  public Runnable mRunnable = new Runnable() {

  public void run() {

  // TODO Auto-generated method stub

  System.out.println("Runnable --> ID IS " + Thread.currentThread().getId());//Runnable同樣處於UI線程中

  mHandler.sendEmptyMessage(1);//向Handler發送空消息

  mHandler.postDelayed(this, 3000);//3s後執行

  }

  };

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  System.out.println("Activity --> ID IS " + Thread.currentThread().getId()); // UI線程ID

  mHandler.postDelayed(mRunnable, 3000);//使用Handler啟動Runnable(3s後)

  }

  }

  由上圖可以看出Handler和Runnable同樣都處於UI主線程,如果在Runnable中執行較為耗時的工作,如網絡數據讀取,會很明顯的影響UI主線程,並很有可能會導致ANR錯誤。

  因此,我希望能夠將耗時的工作放到線程中,通過sendMessage或sendEmptyMessage的方式與Handler通訊,並由Handler更新UI。

  在定時循環線程中,可以使用Handler+Timer+TimerTask的方式

  關鍵代碼如下:

  public class ThreadTest1Activity extends Activity implements OnClickListener {

  /** Called when the activity is first created. */

  public Button mTest;

  public Handler mHandler = new Handler(){

  @Override

  public void handleMessage(Message msg) {

  // TODO Auto-generated method stub

  switch(msg.what) {

  case 1:

  System.out.println("Handler --> ID IS " + Thread.currentThread().getId());// Handler處於UI線程中,更新界面的操作在此處執行

  break;

  }

  super.handleMessage(msg);

  }

  };

  public Timer mTimer = new Timer();//定時器

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  mTest = (Button) findViewById(R.id.teststart);

  mTest.setOnClickListener(this);

  timerTask(); //定時執行

  }

  public void onClick(View v) {

  // TODO Auto-generated method stub

  try {

  mTimer.cancel();//退出之前的mTimer

  mTimer = new Timer();//new一個Timer,否則會報錯

  timerTask();

  } catch (IllegalStateException e) {

  e.printStackTrace();

  }

  }

  public void timerTask() {

  mTimer.schedule(new TimerTask() {

  @Override

  public void run() {

  // TODO Auto-generated method stub

  System.out.println("TimerTask-->Id is " + Thread.currentThread().getId());//TimerTask在它自己的線程中

  mHandler.sendEmptyMessage(1);//向Handler發送消息

  }

  }, 3000, 3000);//定時任務

  }

  @Override

  protected void onStop() {

  // TODO Auto-generated method stub

  mTimer.cancel();// 程序退出時cancel timer

  super.onStop();

  }

  }

  程序啟動後,啟動一個TimerTask,每3s執行一次,可以看出Handler和TimerTask不在同一個線程

  點擊“test”按鈕後,前一個TimerTask被Timer強行cancel,再啟動一個新的TimerTask,這種調用方式主要用在程序間的跳轉的處理,如果不需要這麼復雜,那麼只需前面一個TimerTask就足夠了。點擊“test”後,運行

  總結:在程序退出時記得退出Timer,不然它會一直在後台跑著。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved