Android(七) Handler、多线程、buddle

来源:互联网 发布:淘宝上怎么买氰化钾 编辑:程序博客网 时间:2024/06/04 20:24

本文内容简介:
讲解Handler的传递消息的作用,以及多线程相关的知识,以及buddle的使用

Handler

Handler的简单描述:
1. Handler这个类就是管理某个线程(也可能是进程)的消息队列,比如让Handler处理主线程的消息队列,这样就可以将一些耗时任务放到其他线程之中,待任务完成之后就往主线程的消息队列中添加一个消息,这样Handler的Callback,即handleMessage就会被调用。但是Handler并不是线程安全的,因此官方文档中建议将Handler作为一个静态内部类。
2. 所以Handler只是处理消息,耗时任务放在其他线程。
3. Handler的使用主要是android中无法在主线程(即UI线程)中访问网络、无法在子线程中访问UI线程元素。一般是在子线程中访问网络,然后使用Handler发送message通知主线程处理UI更新操作

1.Handler简单使用

  • 为多线程的一种方法,实际上Handler和main的线程在一个里面。需要参考第3部分的handler使用才是真正的多线程
  • 步骤:
    1. 创建Handler对象
    2. 创建Runnable
    3. 复写runnable中的run,可以加入postdelay
    4. 使用handler.post(runnable)或者handler.removeCallbacks(runnable)**
 Handler handler = new Handler(); //初始化handler Runnable runnable = new Runnable() {    @Override    public void run() {        // TODO Auto-generated method stub        System.out.println("this is runable!");        handler.postDelayed(runnable, 3000); //推迟3000ms再将runnable加入队列    }};
  • 加入和移除Thread
handler.post(runnable);             //加入到队列中handler.removeCallbacks(runnable);  //从队列中移除runnable
  • run运行结束则线程死亡
  • Thread.currentThread().getId()用于得到当前线程的ID

2.Handler的消息传递

  • 需要复写handleMessage函数
Handler handler = new Handler(){        @Override        public void handleMessage(Message msg) {            // TODO Auto-generated method stub            super.handleMessage(msg);            System.out.println(msg.arg1);        }    };
 Runnable runnable = new Runnable() {        @Override        public void run() {            // TODO Auto-generated method stub            /*得到消息对象*/            Message msg = handler.obtainMessage();            msg.arg1 = 10;            /*发送消息到消息队列中,会在handler的处理函数中接收到*/            handler.sendMessage(msg);            System.out.println("this is runable!");            handler.postDelayed(runnable, 3000);        }    };

3.真正多线程

  • 以上两种方法都是在同一个线程中的
Thread thread = new Thread(runnable);thread.start();

4.Handler的另一种消息传递方法

  • Bundle是一种特殊的Map键值对为(string, 其他一般的数据类型-不可以是object)
  • 设置启动handlerThread,然后初始化MyHandler对象,最后得到msg并且发送消息
    HandlerThread handlerThread = new HandlerThread("demo thread");    handlerThread.start(); //必须要运行,不然下面getlooper得到的为空    MyHandler handler = new MyHandler(handlerThread.getLooper());    Message msg = handler.obtainMessage(); //获得msg    Bundle bundle = new Bundle();    bundle.putInt("age", 20);    msg.setData(bundle); //设置数据    msg.sendToTarget();  //发送给获得msg的handler
  • 复写handler
class MyHandler extends Handler{    MyHandler(Looper looper)    {        super(looper);    }    @Override    public void handleMessage(Message msg) {    // TODO Auto-generated method stub        super.handleMessage(msg);        Bundle bundle = msg.getData();        System.out.println(" id:"+Thread.currentThread().getId() + " age: " + bundle.getInt("age"));    }};
0 0