android 定時任務
阿新 • • 發佈:2019-01-29
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 的錯誤。