欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

Android Handler消息传递机制_安卓开发handler的使用

程序员文章站 2021-11-28 11:21:02
...

Android只允许UI线程修改Activity里的UI组件、当Android程序第一次启动时、Android会同时启动一条主线程(Main Thread)、主线程主要负责处理与UI相关的事件、如用户的按键事件、屏幕绘图事件、并把相关的事件分发到对应的组件进行处理、所以、 主线程通常又被称为UI线程

Android只允许UI线程修改Activity里的UI组件、这样会导致新启动的线程无法动态改变界面组件的属性值、但在实际的Android程序开发中、尤其是涉及动画的游戏开发中、需要让新启动的线程周期性的改变界面组件的属性值、这就需要借助于 Handler的消息传递机制 来实现了


一、Handler类简介

Handler类的主要作用有两个

1、在新启动的线程中发送消息

sendMessage(Message msg)  或者 sendEmptyMessage(int what)  两者的差异、请看Android源码:

public final boolean sendMessage(Message msg)
{
    return sendMessageDelayed(msg, 0);
}

public final boolean sendEmptyMessage(int what)
{
    return sendEmptyMessageDelayed(what, 0);
}


再看sendEmptyMessageDelayed(what, 0)的源码:

public final boolean sendEmptyMessageDelayed(int what, long delayMillis)
{
    Message msg = Message.obtain();
    msg.what = what;
    return sendMessageDelayed(msg, delayMillis);
}


其实、sendMessage(Message msg)  和sendEmptyMessage(int what)  实际上是一样的、一个传Message类型的msg、一个传int类型的what、传what的、最终会转为msg、


2、在主线程中获取、处理消息

public void handleMessage(Message msg)


二、使用实例

下面使用Handler以及Timer类实现时间的自动刷新

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final TextView txt=(TextView)findViewById(R.id.showTime);
        final Handler myHandler=new Handler()
        {
            @Override
            public void handleMessage(Message msg)
            {
                if(msg.what==0x12)
                {
                    txt.setText("当前时间:" new java.util.Date());
                }
            }
        };
        Button btn=(Button)findViewById(R.id.btn);
        btn.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                
                new Timer().schedule(new TimerTask() {
                    
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        myHandler.sendEmptyMessage(0x12);
                    }
                }, 0,1000);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}


以上就是Handler类在新启动的线程中发送消息、以及在主线程中获取、处理消息的方法