Android多线程——异步消息处理机制
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Android多线程——异步消息处理机制,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3722字,纯文字阅读大概需要6分钟。
内容图文
Android中的异步消息处理机制主要由四个部分组成,Message、Handler、MessageQueueh和Looper。这里先简要介绍一下四个部分。
1.Message
Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据,Message可以使用what、arg1和arg2字段来携带一些整形数据、使用obj来携带一个Object对象。
2.Handler
Handler是处理者的意思,主要用于发送和处理消息。发送消息一般是使用Handler的sendMessage()方法,而发出的消息经过一系列地辗转处理之后,最终会传递到Handler的handleMessage()方法中。
3.MessageQueue
MessageQueue是消息队列的意思,它主要用于存放所有通过Handler发送的消息,这部分消息会一直存在于消息队列中,等待被处理,每个线程中只会有一个MessageQueue对象。
4.Looper
Looper是每个线程中的MessageQueue 的管家,调用Looper的loop()方法后,会进入到一个无限循环当中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方法中,每个线程中也只会有一个Looper对象。
异步消息处理机制流程
android异步消息处理的机制也就是首先在主线程中创建一个handler对象,并重写handleMessage()方法。
1 public class MainActivity extends Activity { 2 3 @Override 4protectedvoid onCreate(Bundle savedInstanceState) { 5super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 8if (savedInstanceState == null) { 9 getFragmentManager().beginTransaction() 10 .add(R.id.container, new PlaceholderFragment()).commit(); 11 } 12 } 1314publicvoid onStart() { 15super.onStart(); 1617 TextView tv = (TextView) this.findViewById(R.id.textView1); 1819 Button btn = (Button) this.findViewById(R.id.clickBtn); 2021//创建一个handler对象22 CounterHandler handler = new CounterHandler(tv); 2324 ClickListener cl = new ClickListener(handler); 2526 btn.setOnClickListener(cl); 27 } 2829 @Override 30publicboolean onCreateOptionsMenu(Menu menu) { 3132// Inflate the menu; this adds items to the action bar if it is present.33 getMenuInflater().inflate(R.menu.main, menu); 34returntrue; 35 } 3637 @Override 38publicboolean onOptionsItemSelected(MenuItem item) { 39// Handle action bar item clicks here. The action bar will 40// automatically handle clicks on the Home/Up button, so long 41// as you specify a parent activity in AndroidManifest.xml.42int id = item.getItemId(); 43if (id == R.id.action_settings) { 44returntrue; 45 } 46returnsuper.onOptionsItemSelected(item); 47 } 4849/**50 * A placeholder fragment containing a simple view. 51*/52publicstaticclass PlaceholderFragment extends Fragment { 5354public PlaceholderFragment() { 55 } 5657 @Override 58public View onCreateView(LayoutInflater inflater, ViewGroup container, 59 Bundle savedInstanceState) { 60 View rootView = inflater.inflate(R.layout.fragment_main, container, 61false); 62return rootView; 63 } 64 } 6566 }
然后当子线程中需要进行更新UI操作是,就创建一个Message对象,通过handler对象的sendMessage()方法将消息发送出去,之后这条消息会被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理的消息,最后分发回Handler的handleMessage()方法中。
1 // handler类 2 public class CounterHandler extends Handler{ 3 TextView tv; 4 5 CounterHandler(TextView tv){ 6this.tv = tv; 7 } 8//处理消息 9publicvoid handleMessage(Message msg) { 10 System.out.println("收到一条消息"+msg.obj); 11 tv.setText((String)msg.obj); 12 } 13 }
1 // 子线程 2 public class Counter implements Runnable{ 3 Handler handler; 4 5 Counter(Handler handler){ 6this.handler = handler; 7 } 8 9publicvoid run() { 10int i=0; 11while(i<100){ 12 i++; 13 System.out.println(i); 14//显示到TextView上 1516//创建Message17 Message msg = new Message(); 18 msg.obj="count:"+i; 19//通过handletr发送消息20 handler.sendMessage(msg); 2122try { 23 Thread.sleep(1000); 24 } catch (InterruptedException e) { 25// TODO Auto-generated catch block26 e.printStackTrace(); 27 } 2829 } 3031 } 3233 }
1 // 事件监听器 2 public class ClickListener implements OnClickListener{ 3 Handler handler; 4 5 ClickListener(Handler handler){ 6this.handler = handler; 7 } 8 910 @Override 11publicvoid onClick(View v) { 12 Counter counter = new Counter(handler); 13new Thread(counter).start(); 1415 } 1617 }
由于Handler是在主线程中创建的,所以此时handleMessage()方法也会在主线程中运行,于是我们在这里就可以安心的进行UI操作,这就是android多线程的异步消息处理机制。
原文:http://www.cnblogs.com/aladdin-light/p/5459266.html
内容总结
以上是互联网集市为您收集整理的Android多线程——异步消息处理机制全部内容,希望文章能够帮你解决Android多线程——异步消息处理机制所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。