Android Handler消息传递机制_安卓开发handler的使用
2017-03-09 14:05:23  By: shinyuu

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类在新启动的线程中发送消息、以及在主线程中获取、处理消息的方法

若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


快速评论


技术评论

  • 该技术还没有评论、赶快抢沙发吧...
DD记账
top
+