Android 进程和线程模型

发表于:2012-10-08 10:35

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:sunboy_2050    来源:51Testing软件测试网采编

  Message Queue:

  Message Queue是一个消息队列,用来存放通过Handler发布的消息。Android在第一次启动程序时会默认会为UI thread创建一个关联的消息队列,可以通过Looper.myQueue()得到当前线程的消息队列,用来管理程序的一些上层组件,activities,broadcast receivers 等等。你可以在自己的子线程中创建Handler与UI thread通讯。

  通过Handler你可以发布或者处理一个消息或者是一个Runnable的实例。每个Handler都会与唯一的一个线程以及该线程的消息队列管理。

  Looper扮演着一个Handler和消息队列之间通讯桥梁的角色。程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。Looper也把消息队列里的消息广播给所有的Handler,Handler接受到消息后调用handleMessage进行处理。

  实例如下:

public void onCreate(Bundle savedInstanceState) { 
   super.onCreate(savedInstanceState); 
   setContentView(R.layout.main); 
   editText = (EditText) findViewById(R.id.weather_city_edit); 
   Button button = (Button) findViewById(R.id.goQuery); 
   button.setOnClickListener(this); 

   Looper looper = Looper.myLooper();  //得到当前线程的Looper实例,由于当前线程是UI线程也可以通过Looper.getMainLooper()得到 
    messageHandler = new MessageHandler(looper);  //此处甚至可以不需要设置Looper,因为 Handler默认就使用当前线程的Looper 
}

public void onClick(View v) { 
   new Thread() { 
      public void run() { 
          Message message = Message.obtain(); 
          message.obj = "abc"; 
          messageHandler.sendMessage(message);  //发送消息
       } 
   }.start(); 
}

Handler messageHandler = new Handler { 
   public MessageHandler(Looper looper) { 
      super(looper); 
  }
   public void handleMessage(Message msg) { 
      setTitle((String) msg.obj); 
   }
}

  对于这个实例,当这个activity执行完onCreate,onStart,onResume后,就监听UI的各种事件(如Click点击事件)和消息(如Handler Message)。

  当我们点击一个按钮后,启动一个线程,线程执行结束后,通过handler发送一个消息,由于这个handler属于UI线程,因此这个消息也发送给UI线程,然后UI线程又把这个消息给handler处理,而这个handler是UI线程创造的,他可以访问UI组件,因此就更新了页面。

  由于通过handler需要自己管理线程类,如果业务稍微复杂,代码看起来就比较混乱,因此android提供了AsyncTask类来解决此问题。

43/4<1234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号