1. 程式人生 > >Android關於定時器Timer的定義及用法

Android關於定時器Timer的定義及用法

今天主要說一下關於定時器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秒 更新一次 主介面顯示的當前系統時間
這裡寫圖片描述
這裡寫圖片描述