• 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;
    	}
    
    }
    

      

     
  • 相关阅读:
    多线程中sleep方法,简单介绍。
    线程终止的四种方式,interrupt 方法使用的简单介绍。
    线程的生命周期 介绍
    线程池之 newSingleThreadExecutor 介绍
    python 中 *args he **kwargs的区别
    转载:创业者和工作谈的是一场永不分手的虐恋
    给自己一份勇气,勇敢的面对生活
    做一面锃亮的镜子吧
    与人交往时关注内容而不是表情
    最近比较需要正能量:经典励志人生感悟的句子
  • 原文地址:https://www.cnblogs.com/zhouhb/p/5812447.html
Copyright © 2020-2023  润新知