您的位置:首页 > 其它

Timer、TimerTask的简单应用及如何解决多次调度相同任务。

2013-08-14 16:51 483 查看

第一点:如何实现计时器暂停,开始,和重新开始功能

android里面若牵涉到不断动态刷新ui界面的一般会用到计时器TImer,而用到它无非就是暂停,开始,和重新开始这三个功能。具体如何实现呢,参考如下android实例:

public class TimerActivity extends Activity implements OnClickListener

{

Timer timer;

TimerTask task;

Handler handler;

boolean isStop = false;

boolean isGOing = false;

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button start = (Button) findViewById(R.id.button1);

Button stop = (Button) findViewById(R.id.button2);

Button restart = (Button) findViewById(R.id.button3);

start.setOnClickListener(this);

stop.setOnClickListener(this);

restart.setOnClickListener(this);

handler = new Handler()

{

public void handleMessage(Message msg)

{

System.out.println("********");

super.handleMessage(msg);

}

};

}

private void restart()

{

if (timer != null)

{

timer.cancel();

timer = null;

}

if (task != null)

{

task.cancel();

task = null;

}

isStop = false;

isGOing = false;

start();

}

private void stop()

{

isStop = !isStop;

}

private void start()

{

if (isGOing)

{

isStop = false;

return;

}

if (timer == null)

{

timer = new Timer();

}

if (task == null)

{

task = new TimerTask()

{

public void run()

{

if (isStop)

{

return;

}

handler.sendEmptyMessage(0);

}

};

}

if (timer != null && task != null)

{

timer.schedule(task, 1000, 1000);

}

isGOing = true;

}

public void onClick(View v)

{

switch (v.getId())

{

case R.id.button1:

start();

break;

case R.id.button2:

stop();

break;

case R.id.button3:

restart();

break;

}

}

public boolean onCreateOptionsMenu(Menu menu)

{

// TODO Auto-generated method stub

super.onCreateOptionsMenu(menu);

MenuItem item = menu.add(Menu.NONE, Menu.NONE, Menu.NONE, "Exit");

item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener()

{

public boolean onMenuItemClick(MenuItem item)

{

System.exit(0);

return true;

}

});

return true;

}

}

第二点:Timer、TimerTask的简单应用及如何解决多次调度相同任务。

1、Timer类用来干嘛滴?

Timer是提供以指定的时间间隔执行某方法的这样一种机制,即如果想要实现一个定时发送数据,比如每隔3s中发送一次心跳报文,或者执行某个指定的方法,都可以考虑用Timer类来实现,不过要提出的是Timer类一边用来做一些比较简单又不耗时间的操作。据说是因为它执行的任务仍然在主线程里面(不确定,望牛人指出)。

2、Timer类最常用的方法:

cancel() //取消当然任务

schedule(TimerTask
task, long delay) //延时一段时间执行task任务

schedule(TimerTask
task, long delay, long period)//延时delay时间后,执行task任务,以后每隔peroid时间执行一次task任务。

3、如何用?

在Java中如何使用,代码如下:

public class TimerTest

{

public static void main(String[] args)

{

timerTest();

}

private static void timerTest()

{

final Timer timer = new Timer();

TimerTask task = new TimerTask()

{

int i = 0;

public void run()

{

System.out.println("次数====" + i++);

if(i == 10)

{

i = 0 ;

timer.cancel();

// timerTest();

}

}

};

timer.schedule(task, 1000, 1000);

}

}

注: 注释掉蓝色字眼的timerTest();是用来解决多次调度执行相同任务实现滴。

就如实现从0到10输出后,又要从0开始输出,这两次调度。就要用重新调用此方法来实现。

这是由于Timer和TimerTask类的对象只能用一次,所以如果想多次调度同一样的任务,必须重新实例化,这也就是为什么我将final
Timer timer = new Timer();

TimerTask task = new TimerTask()写入方法内部,而不是作为全局变量使用。

Android里面,代码如下:

public
class TimerTestAndroidActivity extends Activity

{

Handler handler;

TextView textView;

Timer timer ;

public
void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

textView = (TextView) findViewById(R.id.textView1);

playTimer();

handler =
new Handler()

{

int
i = 0;

public
void handleMessage(Message msg)

{

i = msg.what;

textView.setText("The current number is " +
i);

if (i == 5)

{

timer.cancel();

playTimer();

}

}

};

}

private
void playTimer()

{

timer=
new Timer();

timer.schedule(new TimerTask()

{ int
i;

public
void run()

{

Message msg = new Message();

msg.what =
i++;

handler.sendMessage(msg);

}

}, 1000, 1000);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐