[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;
}
}
}
以上是关于[Android]View的Handler机制的主要内容,如果未能解决你的问题,请参考以下文章