[Android]View的Handler机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Android]View的Handler机制相关的知识,希望对你有一定的参考价值。

参考技术A 有一定开发经验,大家应该对Handler的机制有非常深刻的了解,Handler在android开发中被广泛用于线程间通信。
近来遇到了一个问题,在view init的情况下使用view自身的handler会崩溃,但是直接使用postDelay却能正常运行。
这里需要思考几个问题
1.view的handler是从哪里来的呢?
2.view的handler为何会崩溃?
3.View的post的运行机制是?
读了这篇文章,你就能理解到这些问题

可以看到是handler是从mAttachInfo过来的.

在dispatchAttachedToWindow的时候来传递过来,而viewgroup中触发这个传递操作。
这里最终会在ViewRootImpl中创建出来AttachInfo对象。
而handler是来自于自定义的ViewRootHandler,那就可以知道,整个Activity的View系统共用一个Handler是由ViewRootImpl创建,用于处理页面视图事件等处理。

dispatchAttachedToWindow是在View调用init初始化之后的,handler还没有被初始化,所以就导致handler返回null对象出外,如果不判空就会崩溃了。

可以看到当mAttachInfo未初始化的时候,会先将runnable塞到一个队列当中。

当view被绑定到窗口的时候,会将队列和handler绑定,然后启动队列任务

消息机制,Handler

package com.example.lenovo.textapp4;

import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Random;

public class Text6Activity extends AppCompatActivity {

    TextView tv_5,tv_6;
    //定义Handler
    Handler h=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            //处理消息
            if (msg.what==1)
            {
                String m=msg.obj.toString();
                tv_5.setText(tv_5.getText()+"  "+m);
            }
            else if (msg.what==2)
            {
                tv_5.setText(tv_5.getText()+"空消息");
            }

        }
    };

    int i=10;
    Handler hl=new Handler()
    {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            switch (msg.what)
            {
                case 1:
                    i++;
                    if (i==20)
                    {
                        return;
                    }
                    tv_6.setText(i+"");
                    //发送
                    hl.sendEmptyMessageDelayed(1,1000);
                    hl.removeMessages(2);

                    break;
                case 2:
                    i--;
                    if (i==1)
                    {
                        return;
                    }
                    tv_6.setText(i+"");
                    hl.sendEmptyMessageDelayed(2,1000);
                    hl.removeMessages(1);
                    break;
                case 3:
                    hl.removeMessages(1);
                    hl.removeMessages(2);
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_text6);

        tv_5=(TextView)findViewById(R.id.tv_5);
        tv_6=(TextView)findViewById(R.id.tv_6);
    }

    //三个按钮
    public void bt2_on(View v)
    {
        switch( v.getId())
        {
            case R.id.bt_3:
                //发送增加消息

                hl.sendEmptyMessage(1);
                break;
            case R.id.bt_4:
                //发送减少消息
                hl.sendEmptyMessage(2);
                break;
            case R.id.bt_5:
                //发送暂停消息
                hl.sendEmptyMessage(3);
                break;
        }
    }
}
View Code

以上是关于[Android]View的Handler机制的主要内容,如果未能解决你的问题,请参考以下文章

Android中的多线程编程附源代码

Handler消息机制的一些原理(直接用code讲解)——Android开发

深入探讨Android异步精髓Handler

Android Handler 消息机制原理解析

Android Handler 消息机制原理解析

Android Handler 消息机制原理解析