学习Android Handler消息传递机制

 更新时间:2016年08月27日 11:34:49   作者:zhouhb  
这篇文章主要为大家详细介绍了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;
 }
 

} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Flutter组件开发过程完整讲解

    Flutter组件开发过程完整讲解

    这篇文章主要介绍了Flutter组件开发过程,Flutter是Google开源的构建用户界面(UI)工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。Flutter 开源、免费,拥有宽松的开源协议,适合商业项目
    2022-11-11
  • Android网络请求框架Retrofit详解

    Android网络请求框架Retrofit详解

    这篇文章主要为大家详细介绍了Android网络请求框架Retrofit,使用Retrofit2.0.0版本进行实例演示,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Android进阶CameraX与Camera2使用比对详解

    Android进阶CameraX与Camera2使用比对详解

    这篇文章主要为大家介绍了Android进阶CameraX与Camera2使用比示例对详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Android下拉列表(Spinner)效果(使用C#和Java分别实现)

    Android下拉列表(Spinner)效果(使用C#和Java分别实现)

    这篇文章主要介绍了Android下拉列表(Spinner)效果(使用C#和Java分别实现),本文直接给出效果图和两种语言的实现代码及布局代码,需要的朋友可以参考下
    2015-06-06
  • Android实现多级树形菜单并支持多选功能

    Android实现多级树形菜单并支持多选功能

    这篇文章主要为大家详细介绍了Android实现多级树形菜单并支持多选功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Android Studio 2020新版本卡在Gradle downloading/sync failed/下载缓慢/下载超时的问题

    Android Studio 2020新版本卡在Gradle downloading/sync failed/下载缓慢/

    Android Studio 2020新版本 卡在Gradle downloading / sync failed / 下载缓慢 / 下载超时 亲测有效解决办法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-12-12
  • 利用Android中BitmapShader制作自带边框的圆形头像

    利用Android中BitmapShader制作自带边框的圆形头像

    这篇文章给大家介绍了一下如何利用BitmapShader制作圆形头像,可以自定义要显示的图片,边框颜色和边框宽度等,有需要的朋友们可以参考借鉴。
    2016-09-09
  • Android实现网易云推荐歌单界面

    Android实现网易云推荐歌单界面

    大家好,本篇文章主要讲的是Android实现网易云推荐歌单界面,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • AccessibilityService实现微信发红包功能

    AccessibilityService实现微信发红包功能

    这篇文章主要为大家详细介绍了AccessibilityService实现微信发红包功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • ViewPager+RadioGroup仿微信主界面

    ViewPager+RadioGroup仿微信主界面

    这篇文章主要为大家详细介绍了ViewPager+RadioGroup仿微信主界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12

最新评论