0%

Handler与Timer计时器Demo

一、简述


> 最近因为一直在准备比赛,做Android端与物联网平台的交互处理,就没怎么去接触一些比较新的技术,记录一个遇到的小Demo,主要用于处理延时操作,本例使用两个Handler和两个Timer。

二、Handler

  1. 作用:

    主要接受子线程发送的数据, 并用此数据配合主线程更新UI(虽然这个Demo没有使用任何页面控件)。

  2. 接收与处理消息:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 创建一个Handler
    private final Handler handlerA = new Handler() {
    // 处理Loop队列中的消息
    public void handleMessage(Message msg) {
    switch (msg.what) {
    case 1:
    ... ...
    break;
    }
    }
    };
  3. 发送消息:

    1
    2
    3
    4
    5
    6
    Message message = new Message();
    message.what = 1;
    message.obj = bm;
    handlerA.sendMessage(message);

    // handlerA.sendEmptyMessage(2);
  4. 通过弱引用创建Handler

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // 弱引用
    Handler handler = new MyHandler(MainActivity.this);

    ... ...

    static class MyHandler extends Handler {

    WeakReference<Activity> mActivityReference;

    MyHandler(Activity activity) {
    mActivityReference = new WeakReference<Activity>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
    final Activity activity = mActivityReference.get();
    super.handleMessage(msg);
    }
    }
  5. 关闭Activity时停止后台线程

    1
    2
    3
    4
    5
    6
    @Override
    protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    mHandler.removeCallbacksAndMessages(null);
    }
  6. Handler延时

    1
    2
    3
    4
    5
    6
    7
    // 延时5s发送数据
    new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
    handlerA.sendEmptyMessage(3);
    }
    }, 5000);

三、Timer

  1. 代码段一:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // 延时1000ms执行TimerTask
    Timer timer = new Timer();

    timer.schedule(new TimerTask() {

    @Override
    public void run() {
    Log.e("test", "这是来自计时器的第一条消息");
    try {
    // 休眠1000ms
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    Log.e("test", "这是来自计时器的第二条消息");
    }
    }, 1000);
  2. 代码段二:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Timer timer = new Timer();
    // 延时循环(延时1000ms调用一次task,每2000ms一次)
    //task:TimerTask、1000: 延时多久执行、2000:每隔多长时间执行一次
    timer.schedule(task, 1000, 2000);

    ... ...

    TimerTask task = new TimerTask() {

    @Override
    public void run() {
    handlerB.sendEmptyMessage(0x01);
    }
    };

四、项目地址

https://github.com/sdwfqin/AndroidSamples