您的位置:首页 > 其它

Timer和TimerTask的用法

2016-12-14 11:13 162 查看
Timer和TimerTask在开发中挺常见。一般都是混合使用,Timer是一个普通的类,其中有几个重要的方法;而TimerTask则是一个抽象类,其中有一个抽象方法run(),类似线程中的run()方法,我们使用Timer创建一个他的对象,然后使用这对象的schedule方法来完成这种间隔的操作。

schedule方法有三个参数

第一个参数就是TimerTask类型的对象,我们实现TimerTask的run()方法就是要周期执行的一个任务;

第二个参数有两种类型,第一种是long类型,表示多长时间后开始执行,另一种是Date类型,表示从那个时间后开始执行;

第三个参数就是执行的周期,为long类型。

schedule方法还有一种两个参数的执行重载,第一个参数仍然是TimerTask,第二个表示为long的形式表示多长时间后执行一次,为Date就表示某个时间后执行一次。 

Timer就是一个线程,使用schedule方法完成对TimerTask的调度,多个TimerTask可以共用一个Timer,也就是说Timer对象调用一次schedule方法就是创建了一个线程,并且调用一次schedule后TimerTask是无限制的循环下去的,使用Timer的cancel()停止操作。当然同一个Timer执行一次cancel()方法后,所有Timer线程都被终止。

我的应用场景是:数据加载时要求有个一加载框,但是有时候数据加载很快也会导致加载弹窗一闪而过这样使用户体验效果不好。于是就用到timer 延时500毫秒,如果在500毫秒内数据加载好了那就直接cancel(),如果过了500毫秒没加载出来那么就弹出加载弹窗直到加载成功弹窗消失,此时也要把timer结束掉。

用法:

//true 说明这个timer以daemon方式运行(优先级低,程序结束timer也自动结束)
java.util.Timer timer = new java.util.Timer(true);

TimerTask task = new TimerTask() {
public void run() {
//每次需要执行的代码放到这里面。
}
};

//以下是几种调度task的方法:

//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);
事例:

private void initMoneyList(String year) {
if (wageList!=null){
wageList.clear();
}
mTimer = new Timer();
setTimerTask();

String accessToken = PreferenceUtils.getPrefString(mContext, Constants.ACCESS_TOKEN, "");
String path = getString(R.string.interface_url)+ConstantTeacher.HOST_NPRGETMODELLIST;
Map<String,String> params = new HashMap<>();
params.put("accessToken",accessToken);
params.put("year",year);
HttpLoader.get(path, params, GetModeListBean.class, ConstantTeacher.REQUEST_NPRGETMODELLIST,
new HttpLoader.ResponseListener() {
@Override
public void onGetResponseSuccess(int requestCode, RBResponse response) {
mTimer.cancel();
DialogUtils.closeProgressDia();

GetModeListBean getModeListBean = (GetModeListBean) response;
List<GetModeListBean.ResultEntity> resultList = getModeListBean.getResult();
if (resultList!=null){

wageList.addAll(resultList);
listAdapter.notifyDataSetChanged();
if (resultList.size()==0){
noMsg.setVisibility(View.VISIBLE);
}else {
noMsg.setVisibility(View.GONE);
}
}else {
noMsg.setVisibility(View.VISIBLE);
}

}

@Override
public void onGetResponseError(int requestCode) {
mTimer.cancel();
}
});
}
private void setTimerTask() {

mTimer.schedule(new TimerTask() {
@Override
public void run() {
Message message = new Message();
message.what = 1;
doActionHandler.sendMessage(message);
}
}, 500,10000);
}
/**
*UI线程操作的内容
*/
private Handler doActionHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int msgId = msg.what;
switch (msgId) {
case 1:
if(client == null){
client = new AsyncHttpClient(6000);
}
DialogUtils.showProgressDia(mContext, "正在获取数据...", client);
break;
default:
break;
}
}
};

@Override
protected void onDestroy() {
super.onDestroy();
HttpLoader.cancelRequest(ConstantTeacher.REQUEST_NPRGETYEARLIST);
HttpLoader.cancelRequest(ConstantTeacher.REQUEST_NPRGETMODELLIST);
mTimer.cancel();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: