編輯: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,不然它會一直在後台跑著。
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
隨著Android設備增多,不少網站都開始設備Android設備,而Android主流設備類型以手機和平板為主。網站在適配時通過User Agent(用戶代理,以
GPS定位是目前很多手機都有的功能,且非常實用。本文以實例形式講述了Android中GPS定位的用法。分享給大家供大家參考之用。具體方法如下: 一般在Androi
一般SDK中都會帶有一些示例程序,說明具體用法,Android SDK也是如此