Android学习笔记(11)-开始做一个数独游戏[下]

来源:互联网 发布:月薪15万的程序员 编辑:程序博客网 时间:2024/05/29 08:32
 

继续,最后再讨论一下定时器的实现。

本来很简单的一件事,直接用java.util.timer应该就够用了,但是发现在它的task中无法去invalidate我们的MainView,很郁闷。这一点的处理说明Android还是相对线程安全的。

折腾良久,明白了非得再做一个Handler,才能在线程中操作界面元素。所以,代码比brew复杂了一点。

先还是用TimerTimerTask来做,如下:

public TimerHandler timerHandler;

public Timer timer;
public MyTimerTask    task;

... ...

timer=
new Timer(true);
task=
new MyTimerTask(this);

... ...

那个MyTimerTaskMainActivity的一个内嵌类,实现如下:

    private class MyTimerTask extends TimerTask
    
...{
        
private MainActivity me;
        
private int a=0;
        
        
public MyTimerTask(MainActivity p)...{
            me=p;
        }
        
public void run()...{
            me.gridView.time++;                
            Log.d("MyTask",Integer.toString(me.gridView.time));    

            timerHandler.sendEmptyMessage(0);            
        }
    }    

这里做两件事,一是将gridView中的time加一,二是发送一个消息通知timerHandler。原来我在这里直接让MainView去刷新屏幕,发现不行,所以就改成这样处理了。

然后就是如何实现TimerHandler类的,也不复杂,就是让它去刷新一下屏幕即可。

public class TimerHandler extends Handler ...{

    
private MainView me;
    
public TimerHandler(MainView m)...{
        me=m;
    }
    
    @Override
    
public void handleMessage(Message msg) ...{
        Log.d("Ti",msg.toString());
        me.invalidate();
    }

}

如此一来,就顺了。

MainView中的onDraw,根据当前的time值显示成00:00:00的格式即可。

另外,发现Android的模拟器运算速度不如BREW的模拟器,相当的慢。

原创粉丝点击