博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
j2me-定时器(timertask)使用及初探
阅读量:4043 次
发布时间:2019-05-24

本文共 2140 字,大约阅读时间需要 7 分钟。

首先,说下定时器的基本使用,以下内容摘自nokia 论坛里的一篇文章:

 

《为60系列平台设计java应用》--

定时器

 

 

各种定时器让各种应用能方便地规划任务,而不必对线程进行调配。使用线程通常需要更为复杂的设计,并需要更多的系统资源,对各种小设备而言,比较奢侈。

 

创建一个定时器的范例:

 

 

public class mytask extends timertask

 

 

{

 

 

private int icount;

 

 

public mytask(int astart)

 

 

{

 

 

super();

 

 

icount = astart;

 

 

}

 

 

public void run()

 

 

{

 

 

icounter--;

 

 

system.out.println(“counter is now ” + icounter);

 

 

if (icounter == 0)

 

 

cancel();

 

 

}

 

 

}

 

 

构建一个定时器并向其中添加mytask

 

mytask mytask = new mytask(50);

 

 

timer mytimer = timer();

 

 

mytimer.schedule(mytask, 1000, 20000);

 

 

在这个范例中,每20秒就会调用一次mytaskrun()方法。

 

并不保证定时器任务一定按时执行。各个定时器任务依次发生。如果其中一个任务需时很长,下一个任务只能在当前任务完成之后再执行。对于循环执行的任务,最好保证run()方法能很快完成。

 

一个以上地定时器也是可能的,这样就可以将任务分配到几个定时器上。然而,使用多定时器要多加小心,因为每个定时器只运行自己的线程,同步可能是需要的。

 

 

 

上面就是定时器的基本用法,对于一些简单的定时器操作这样做就可以了,直接把要执行的代码放入run中。对于逻辑结构复杂点的,需要多次执行run方法的时候就要另想办法来做了。下面是我使用定时器的一个框架,实际上就是个面向对象的应用,比较简单也好理解,希望对大家有个帮助,也希望有不同见解的朋友共同交流。

 

同样要有个类来继承timertask

 

import java.util.timertask;

 

 

public class gametask extends timertask {

 

 

    private gameobject m_object;

 

 

    public gametask(gameobject object) {

 

 

        m_object = object;

 

 

    }

 

 

    public void run() {

 

 

        m_object.gametask();

 

 

    }

 

 

}

 

 

然后再定义一个gameobject接口:

 

public interface gameobject {

 

 

    public abstract void gametask();

 

 

}

 

 

最后就是在你的canvas类中使用了

:

 

public class gamecanvas extends fullcanvas implements gameobject {

 

 

   

。。。。。。

 

private static timer m_timer;

 

 

private static byte runcase

 

public gamecanvas(mjmidlet midlet, whkrms whkrms) {

 

 

   

。。。。。。

 

}

 

 

public void gametask() {

 

 

        switch (runcase) {

 

 

        case 0:

 

 

            aaagametask();

 

 

            break;

 

 

        case 1:

 

 

            bbbgametask();

 

 

            break;

 

 

        case 2:

 

 

            cccgametask();

 

 

            break;

 

 

        }

 

 

//

分别实现各个方法,也就是run里面要执行的东西,分情况来执行对应 的run

 

 public void bbbgametask() {

 

 

        m_bflash = !m_bflash;

 

 

        repaint();

 

 

        m_timer.schedule(new gametask(this), 500l);

 

 

    }

 

 

 

public void keypressed(int i) {

 

 

        switch (runcase) {

 

 

        case 1:

 

 

            aaapressed(i);

 

 

            break;

 

 

        case 2:

 

 

            bbbpressed(i);

 

 

            break;

 

 

        }

 

 

}

 

//

分别实现相应的按键pressed()方法,可以在其中设置runcase的值,来控制程序。当然也可在其他地方设置runcase来控制。

 

public void aaapressed

int i{

 

 

     if

i==-7{

 

        

。。。。。。

 

         m_timer.cancel();

 

 

         runcase=2

 

         repaint();

 

 

        (new timer()).schedule(new gametask(this), 500l);

 

 

}}

 

 

public void paint(graphics g) {

 

 

        switch (runcase) {

 

 

        case 0:

 

 

       

。。。。

 

        break

 

        case 1

 

       

。。。。

 

        case 2

 

       

。。。。

 

}}}

 

 

  整个的框架就是这样了~我用这个开发的是麻将类游戏,并不是整个游戏的框架哦~当然线程在整个游戏中也是要用到的,这里就不多谈了

 

 

 

转载地址:http://wcedi.baihongyu.com/

你可能感兴趣的文章
设计模式(7) - Decorator装饰者模式
查看>>
设计模式(8) - Composite组合模式
查看>>
设计模式(9) - Flyweight享元模式
查看>>
设计模式(10) - Facade外观模式
查看>>
设计模式(11) - Proxy代理模式
查看>>
设计模式(12) - Template模板方法模式
查看>>
设计模式(13) - Strategy策略模式
查看>>
设计模式(14) - State状态模式
查看>>
设计模式(15) - Observer观察者模式
查看>>
设计模式(18) - Command命令模式
查看>>
Fedora16/RedHat6.4下配置samba
查看>>
C++中const对象引用做为形参
查看>>
C++11使用lambda操作std::map
查看>>
VMware下Linux以NAT方式上网
查看>>
RHEL6.4编译安装gcc4.8.1
查看>>
C++11线程指南(1)--创建线程
查看>>
C++11线程指南(2)--Lambda线程实现
查看>>
C++11线程指南(3)--右值与左值
查看>>
C++11线程指南(4)--右值引用与移动语义
查看>>
C++11线程指南(5)--线程的移动语义实现
查看>>