1.安卓倒计时

public class MainActivity extends ActionBarActivity implements OnClickListener{


private EditText edit;
private TextView text;
private Button get, start, stop; 
private int i = 0;
private Timer timer = null;
private TimerTask task = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }
    
    private void initView()
    {
    edit = (EditText)findViewById(R.id.editText1);
    text = (TextView)findViewById(R.id.textView1);
    get = (Button)findViewById(R.id.button1);
    start = (Button)findViewById(R.id.button2);
    stop = (Button)findViewById(R.id.button3);
    get.setOnClickListener(this);
    start.setOnClickListener(this);
    stop.setOnClickListener(this);
    }


@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.button1:
if(timer!=null){
stopTime();
}
text.setText(edit.getText().toString());
if(!TextUtils.isEmpty(edit.getText()))
{
i = Integer.parseInt(edit.getText().toString());
}
break;
case R.id.button2:
startTime();
break;
case R.id.button3:
stopTime();
break;
}
}

private Handler mHandler = new Handler(){
public void handleMessage(Message msg){
text.setText(msg.arg1 + "");
startTime();
};
};


private void startTime() {
// TODO Auto-generated method stub
timer = new Timer();
task = new TimerTask(){


@Override
public void run() {
// TODO Auto-generated method stub
if(TextUtils.isEmpty(text.getText()))
{
return;
}
--i;
Message message = mHandler.obtainMessage();
message.arg1 = i;
mHandler.sendMessage(message);
}

};
timer.schedule(task, 1000);

}


private void stopTime() {
// TODO Auto-generated method stub
timer.cancel();
}
}


关键点:

Timer,TimerTask:Java为我们提供的计时器的工具类,即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线程都被终止。

Handler:我们需要把耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,但是当子线程中有涉及到操作UI的操作时,就会对主线程产生危险,也就是说,更新UI只能在主线程中更新,在子线程中操作是危险的. 这个时候,Handler就出现了来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传递)Message对象,(里面包含数据), 把这些消息放入主线程队列中,配合主线程进行更新UI。

Message:Message 可以传递的参数有:

1. arg1 arg2 整数类型,是setData的低成本替代品。传递简单类型

2. Object 类型 obj

3. what  用户自定义的消息代码,这样接受者可以了解这个消息的信息。每个handler各自包含自己的消息代码,所以不用担心自定义的消息跟其他handlers有冲突。

4.其他的可以通过Bundle进行传递

     Message可以通过new Message构造来创建一个新的Message,但是这种方式很不好,不建议使用。最好使用Message.obtain()来获取Message实例,它创建了消息池来处理的。


所谓的消息机制其实很简单,实现这种机制需要只需要四步:

     1、实例化Looper(因为实例化Handler时需要一个looper);

     2、实例化Handler,这里需要覆盖handleMessage方法,处理收到的消息;

     3、 实例化Message对象,调用已经实例化好的handler对象的obtainMessage方法,把数据传给obtainMessage方法,obtainMessage方法就会实例化一个Message对象。(这里也可以发送实现Runnable接口的对象);

     4、调用Handler的sendMessage方法把实例化好的Message对象发送出去,handleMessage方法处理Message对象。

对每个线程过程都是一样的,只要按照上面的四个步骤来就可以发送和接收消息了。


发布了25 篇原创文章 · 获赞 1 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章