1. 程式人生 > >Android 延時任務 Timer簡單使用

Android 延時任務 Timer簡單使用

1,介紹:

【1】Timer是一種定時器工具,用來在一個後臺執行緒計劃執行指定任務。它可以計劃執行一個任務一次或反覆多次。

【2】在Android平臺中需要反覆按週期執行方法可以使用Java上自帶的TimerTask類,TimerTask相對於Thread來說對於資源消耗的更低,除了使用Android自帶的AlarmManager使用Timer定時器是一種更好的解決方法。

【3】執行機制:

程式執行:

在初始化Timer時 ,開啟一個執行緒迴圈提取任務陣列中的任務,如果任務陣列為空,執行緒等待直到新增任務;

當新增任務時,喚醒執行緒,提取陣列中標記為1的任務,

如果該任務狀態為CANCELLED,則從陣列中刪除任務,continue ,繼續迴圈提取任務;

然後將當前時間與任務執行時間點比較 標記taskFired=executionTime<=currentTime;

taskFired =false ,說明任務執行時間還沒到,則呼叫wait等待(executionTime-currentTime) 時間長度,然後迴圈重新提取該任務;

taskFired =true,說明任務執行時間已經到了,或者過去了。繼續判斷 任務迴圈時間間隔period;period=0時,說明此次任務是非迴圈任務,直接將該任務從陣列中刪除,並將狀態置為EXECUTED,然後執行任務的run方法!

period!=0時,說明此次任務時迴圈任務,將該任務的執行時間點向前推進,具體推進時間根據呼叫的方法判斷;

如果是schedule方法,則在當前時間基礎上向前推進period時間長度;

如果是scheduleAtFixedRate方法,則在當前任務執行時間點基礎上向前推進period時間長度,最後執行任務的run方法;迴圈提取任務

2,常用方法:

//time為Date型別:在指定時間執行一次。

timer.schedule(task, time);

//firstTime為Date型別,period為long,表示從firstTime時刻開始,每隔period毫秒執行一次。timer.schedule(task, firstTime, period);

//delay 為long型別:從現在起過delay毫秒執行一次。

timer.schedule(task, delay);

//delay為long,period為long:從現在起過delay毫秒以後,每隔period毫秒執行一次。

timer.schedule(task, delay, period);

3,簡單使用:

public class MainActivity extends Activity {



    private Timer timer;

    private TimerTask task;



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        timer = new Timer();

        task = new TimerTask() {

            

            @Override

            public void run() {

                System.out.println("我執行了");

                

            }

        };

        //1秒後 執行task  

        timer.schedule(task, 1000,1000);

    }



    @Override

    protected void onDestroy() {

        //當Activity銷燬的時候 終止計時器

        timer.cancel();

        task.cancel();

        super.onDestroy();

    }

}



4,使用timer 更新UI

public class MainActivity extends AppCompatActivity {



    private Handler handler = new Handler(){

        @Override

        public void handleMessage(Message msg) {

            button.setText("wudi");



            super.handleMessage(msg);

        }

    };

    private Button button;

    private Timer timer;

    private TimerTask timerTask;



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.button);

        //【1】建立定時器

        timer = new Timer();

        //【2】建立定時任務,把要做的事放在run方法裡

        timerTask = new TimerTask() {

            @Override

            public void run() {

                Message message = new Message();

                handler.sendMessage(message);

            }

        };

        //【3】定時器進行安排

        timer.schedule(timerTask, 12000);

    }



    @Override

    protected void onDestroy() {

        //【4】在activity消失的時候取消任務

        timer.cancel();

        timerTask.cancel();

        super.onDestroy();

    }

}