Android(七) Handler、多线程、buddle

本文内容简介:
讲解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"));
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值