編輯:關於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,不然它會一直在後台跑著。
Android文件下載之進度檢測,android文件下載 近期因為項目的需要,研究了一下Android文件下載進度顯示的功能實現,接下來就和大家一起分享學習一下,希望對
Android消息機制入門,android機制入門接著處理《Android 網絡圖片查看器》中出現的問題 使用添加子線程,修改原程序: package com.wuyu
我們在使用某個系統進行開發時,有必要先大體了解下它的框架結構。Android開
自定義控件三部曲之繪圖篇(八)——Paint之ColorMatrix與濾鏡效果 這篇主要講解ColorMatrix的相關知識,這裡將涉及到矩陣乘法的相關知識。所以這篇