Android關於定時器Timer的定義及用法
阿新 • • 發佈:2019-01-01
今天主要說一下關於定時器Timer的用法及應用場景
還是接著昨天關於回撥函式的例子,詳細請看我的上一篇Android關於回撥函式的定義及用法
在此基礎上定義定時器,並不斷請求資料,進行介面更新操作。這種情況一般應用在當我的介面需要不停的更新資料時。
例如,每隔幾秒介面資料會進行改變,這時就需要用到定時器了,話不多說,看程式碼:
還是昨天的專案
①回撥介面 DataCallBack 定義
/**
* 定義一個回撥函式
* @author maoxf
*
*/
public interface DataCallBack {
//用於接收資料的方法
public abstract void acceptData(int num);
}
②佈局檔案定義
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="text"
android:textSize="25sp"/>
</RelativeLayout>
③MainActivity
public class MainActivity extends Activity {
private TextView text;
// 建立Handler物件,用於主執行緒更新介面
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.arg1) {
case 1:
//這裡用獲取系統的時間來模擬更新介面資料
SimpleDateFormat formatter = new SimpleDateFormat(
"yyyy年MM月dd日 HH:mm:ss ");
String date = formatter.format(new Date(System.currentTimeMillis()));
text.setText(date);
break;
case 2:
text.setText("這裡是資料2請求成功並更新");
break;
default:
break;
}
}
};
// 建立回撥函式,並實現方法
private DataCallBack dc = new DataCallBack() {
@Override
public void acceptData(int num) {
Message msg = Message.obtain();
msg.arg1 = num;
handler.sendMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.text);
// 建立請求資料類物件,將回調物件作為引數傳過去
RequestTest req = new RequestTest(dc);
}
}
④RequestTest請求資料類的定義
/**
* 模擬請求資料的類
* @author maoxf
*
*/
public class RequestTest {
private DataCallBack dc;
//建立Timer物件
private Timer timer = new Timer();
//建立TimerTask任務棧,重寫Run方法
private TimerTask task = new TimerTask() {
@Override
public void run() {
//這裡開始請求資料,此處就略過網路請求過程
if (true) {
//假設這裡請求資料成功返回資料,這裡就可以回撥DataCallBack的方法來判斷並操作資料
dc.acceptData(1);//根據請求資料的不同設不同的值
}else{
//請求失敗
}
}
};
public RequestTest() {}
//構造方法
public RequestTest(DataCallBack dc){
this.dc = dc;
requestData();
}
/**
* 請求資料的方法
*/
private void requestData() {
//引數1:延遲3秒傳送,引數2:每隔3秒傳送一下
timer.schedule(task, 3000, 3000);
}
}
看到這裡有沒有大概理解了,我來理一下思路:
1)在資料請求的類中,在請求資料的方法requestData()中每個一段時間給TimerTask任務棧傳送一次訊息,執行run方法
2)在定時任務棧的run方法中,進行網路請求資料,並回調DataCallBack中的acceptData()方法,也可以將請求結果作為引數傳遞過去
3)在acceptData()方法中用handler往主執行緒傳送訊息
4)在handler中進行主執行緒的更新操作
最後是結果展示圖:
每隔3秒 更新一次 主介面顯示的當前系統時間