zoukankan      html  css  js  c++  java
  • Android学习之Handler消息传递机制

    Android只允许UI线程修改Activity里的UI组件。当Android程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如用户的按键事件、屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以,主线程通常又被称为UI线程
    Android只允许UI线程修改Activity里的UI组件,这样会导致新启动的线程无法动态改变界面组件的属性值。但在实际的Android程序开发中,尤其是涉及动画的游戏开发中,需要让新启动的线程周期性的改变界面组件的属性值,这就需要借助于Handler的消息传递机制来实现了。
    1 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)
    2 使用实例
    下面使用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;
    	}
    
    }
    

      

     
  • 相关阅读:
    docker容器里面执行top报“TERM environment variable not set.”
    docker安装ubuntu以后无ifconfig命令解决办法
    免sudo使用docker
    centos6下安装docker
    Hadoop Aggregate Resource Allocation解释
    [] 与[[]]的区别
    awk如何传递外部变量?
    基于PaddlePaddle的语义匹配模型DAM,让聊天机器人实现完美回复 |
    作为一名程序员,在面试中如何展现你Python的coding能力?
    入门机器学习:代码+预训练模型,赶快练练吧!
  • 原文地址:https://www.cnblogs.com/zhouhb/p/5812447.html
Copyright © 2011-2022 走看看