安卓学习-Handler

今天学习Handler。
因为安卓是单线程模式,也就是说只能在主线程中进行更新UI等操作,而很多耗时操作如下载,网络传输等都应该放到一个子线程中,否则容易引起主线程因为耗时太久而被关闭的这样一个风险。而子线程和主线程之间通过Handler进行交流,因为子线程也会进行UI的更新,而规定UI 更新只能在主线程中,所以就只有通过一个特殊的异步处理机制Handler来达到我们想要的目的。
一、特点:
1.可以分发Message对象和Runnable对象到主线程中,每个Handler实例,都会绑定到创建他的线程中,两个作用:
(1)安排消息或Runnable 在某个主线程中某个地方执行
(2)安排一个动作在不同的线程中执行
二、实例:
子线程是另一个线程,一般用Thread,而主线程与子线程之间通过Handler来交流。

public class MYhandler extends Activity {
        Button button;
        MyHandler myHandler;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.handlertest);
            button = (Button) findViewById(R.id.b5);
            myHandler = new MyHandler();
            MyThread m = new MyThread();
            new Thread(m).start();
        }
         // 接受消息,处理消息 ,此Handler会与当前主线程一块
        class MyHandler extends Handler {
            public MyHandler() {
            }
            public MyHandler(Looper L) {
                super(L);
            }
            // 子类必须重写此方法,接受数据
            @Override
            public void handleMessage(Message msg) {
                Log.d("MyHandler", "handleMessage。。。。。。");
                super.handleMessage(msg);
                // 此处可以更新UI
                Bundle b = msg.getData();
                String color = b.getString("color");
                MYhandler.this.button.append(color);
            }
        }
        class MyThread implements Runnable {
            public void run() {
                try {Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Log.d("thread。。。。。。。", "mThread。。。。。。。。");
                Message msg = new Message();
                Bundle b = new Bundle();// 存放数据
                b.putString("color", "我的");
                msg.setData(b);
                MYhandler.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
            }
        }
    }
Android handler机制是一种在Android中用于处理异步消息和线程通信的重要机制。其主要作用是将消息和任务抛到主线程的消息队列中,以便主线程按照一定的规则按照队列中的顺序处理这些消息和任务。 1. Handler的实例化:在Android中,创建一个Handler的实例可以通过以下两种方式实现: 直接实例化: 创建一个Hanlder对象,代码示例: Handler handler = new Handler(); 绑定Looper:在子线程中创建Handler的话,需要先通过以下代码获取Looper对象,然后再将其传入Handler的构造函数中: Looper looper = Looper.myLooper(); Handler handler = new Handler(looper); 2. Handler的使用:当一个线程需要将一个耗时的任务交给主线程去执行的时候,它可以使用Handler来完成。以下是Handler的常见用法示例: 使用Handler处理消息: Handler myHandler = new Handler() { public void handleMessage(Message msg) { //在这里处理消息 } }; Message msg = myHandler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putString("my_key", "my_string"); msg.setData(bundle); myHandler.sendMessage(msg); 使用Handler更新UI: Handler myHandler = new Handler() { public void handleMessage(Message msg) { //更新UI } }; myHandler.sendEmptyMessage(0); 3. Handler的原理:在Android系统中,所有的UI操作都必须在主线程上完成。这时,Handler就扮演了一个传递任务的中介角色。它把来自子线程的消息和任务封装成Message对象,最后以一定的顺序扔到主线程的消息队列中等待执行。主线程通过Looper不断地循环读取消息队列中的消息和任务,然后依次执行。这就是Handler机制的基本原理。 4. Handler配合其他机制使用:为了更好地发挥Handler的作用,还可与一些其他机制有效配合使用,例如:AsyncTask、MessageQueue等等。通过多种机制的相互配合,可以实现复杂的异步消息处理和并发控制,提升了Android应用程序的性能和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值