1. 程式人生 > >android 定時任務

android 定時任務

Android 定時任務有好幾種實現方法,可以針對不同的情況使用。我先寫我用過的這種,後面再補充。
一、利用Timer + TimerTask + runOnUiThread 實現定時任務
先介紹下從網上看到的使用方法

private TimerTask mTimerTask = new TimerTask() {
        @Override
        public void run() {

            runOnUiThread(new Runnable() {
                @Override
                public
void run() { //處理延時任務 } }); } }; timer.schedule(task, 2000, 3000);//啟動定時任務 timer.cancel();//關閉定時任務

再說下此次專案中的簡單使用(此次任務的目的是點選按鈕實現定時的從網路請求資料,然後將是否請求成功結果用TextView展示出來)

@Override
    public void onClick(View view) {
        int i = view.getId();
        if
(i == R.id.button_baidu) { mTask1 = new baiduTimerTask();//放任務時都要建立新的任務物件,且要保證上次任務已經移除。 mTimer.schedule(mTask1, DELAYTIME, PERIOD); } else if (i == R.id.button_baidu_cancel) { mTvBaidu.setText(""); if (mTimer != null) { if (mTask1 != null
) { mTask1.cancel(); } } } else if (i == R.id.button_http_name) { mTask2 = new questionListTimerTask(); mTimer.schedule(mTask2, DELAYTIME, PERIOD); } else if (i == R.id.button_http_name_cancel) { mTvHttpName.setText(""); if (mTimer != null) { if (mTask2 != null) { mTask2.cancel(); } } } } class baiduTimerTask extends TimerTask { @Override public void run() { HttpManager.getBaidu(this, new Callback() { @Override public void onFailure(Call call, final IOException e) { final String baiduFailureInfo = e.toString(); runOnUiThread(new Runnable() { @Override public void run() { mTvBaidu.setText(String.valueOf(i) + ":baidufailed"); i++; } }); } @Override public void onResponse(Call call, Response response) throws IOException { final String baiduSuccessInfo = response.body().string(); runOnUiThread(new Runnable() { @Override public void run() { mTvBaidu.setText(String.valueOf(i) + ":baidusuccess"); i++; } }); } }); } } class questionListTimerTask extends TimerTask { @Override public void run() { HttpManager.questionList(this, TDSSCacheManager.getInstance().getStudentId(), 1, 10, new HttpCallBack() { @Override public void onSuccess(Object o) { mTvHttpName.setText(String.valueOf(k) + ":questionListsuccess"); k++; } @Override public void onFailed(String error) { mTvHttpName.setText(String.valueOf(k) + ":" + error); k++; } }); } }

注意,每次放任務都要新建一個任務,且確保上一次的任務被移除了,否則會報java.lang.IllegalStateException: TimerTask is scheduled already 的錯誤。