近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子。

 andriod提供了 Handler 和 Looper 来满足线程间的通信。例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的。

在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个事android的新 概念。我们的主线程(UI线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handle,我们有消息循环,就要往消息循环里 面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,消息的的处理,把这些都封装在Handle里面,注意Handle只是针对那 些有Looper的线程,不管是UI线程还是子线程,只要你有Looper,我就可以往你的消息队列里面添加东西,并做相应的处理。
但是这里还有一点,就是只要是关于UI相关的东西,就不能放在子线程中,因为子线程是不能操作UI的,只能进行数据、系统等其他非UI的操作。
  在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个是android的新概念。我们的主线程(UI线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handler,我们有消息循环,就要往消息循环里面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,把这些都封装在Handler里面,注意Handler只是针对那 些有Looper的线程,不管是UI线程还是子线程,只要你有Looper,我就可以往你的消息队列里面添加东西,并做相应的处理。

但是这里还有一点,就是只要是关于UI相关的东西,就不能放在子线程中,因为子线程是不能操作UI的,只能进行数据、系统等其他非UI的操作。


  一个Handler的创建它就会被绑定到这个线程的消息队列中,如果是在主线程创建的,那就不需要写代码来创建消息队列了,默认的消息队列会在主线程被创建。但是如果是在子线程的话,就必须在创建Handler之前先初始化线程的消息队列。如下面的代码:

Java代码
  1. classChildThreadextendsThread{
  2. publicvoidrun(){
  3. /*
  4. *创建handler前先初始化Looper.
  5. */
  6. Looper.prepare();
  7. /*
  8. *在子线程创建handler,所以会绑定到子线程的消息队列中
  9. *
  10. */
  11. mChildHandler=newHandler(){
  12. publicvoidhandleMessage(Messagemsg){
  13. /*
  14. *Dosomeexpensiveoperationsthere.
  15. */
  16. }
  17. };
  18. /*
  19. *启动该线程的消息队列
  20. */
  21. Looper.loop();
  22. }
  23. }





当Handler收到消息后,就会运行handleMessage(…)的回调函数,可以在里面做一些耗时的操作。




最后完成了操作要结束子线程时,记得调用quit()来结束消息循环队列。

mChildHandler.getLooper().quit();



下面是一个线程间通信的小例子:

Java代码
    1. /**
    2. *
    3. *@authorallin.dev
    4. *http://allin.cnblogs.com
    5. *
    6. */
    7. publicclassMainThreadextendsActivity{
    8. privatestaticfinalStringTAG="MainThread";
    9. privateHandlermMainHandler,mChildHandler;
    10. privateTextViewinfo;
    11. privateButtonmsgBtn;
    12. @Override
    13. publicvoidonCreate(BundlesavedInstanceState){
    14. super.onCreate(savedInstanceState);
    15. setContentView(R.layout.main);
    16. info=(TextView)findViewById(R.id.info);
    17. msgBtn=(Button)findViewById(R.id.msgBtn);
    18. mMainHandler=newHandler(){
    19. @Override
    20. publicvoidhandleMessage(Messagemsg){
    21. Log.i(TAG,"Gotanincomingmessagefromthechildthread-"
    22. +(String)msg.obj);
    23. //接收子线程的消息
    24. info.setText((String)msg.obj);
    25. }
    26. };
    27. newChildThread().start();
    28. msgBtn.setOnClickListener(newOnClickListener(){
    29. @Override
    30. publicvoidonClick(Viewv){
    31. if(mChildHandler!=null){
    32. //发送消息给子线程
    33. MessagechildMsg=mChildHandler.obtainMessage();
    34. childMsg.obj=mMainHandler.getLooper().getThread().getName()+"saysHello";
    35. mChildHandler.sendMessage(childMsg);
    36. Log.i(TAG,"Sendamessagetothechildthread-"+(String)childMsg.obj);
    37. }
    38. }
    39. });
    40. }
    41. publicvoidonDestroy(){
    42.       super.onDestroy();
    43. Log.i(TAG,"Stoploopingthechildthread'smessagequeue");
    44. mChildHandler.getLooper().quit();
    45. }
    46. classChildThreadextendsThread{
    47. privatestaticfinalStringCHILD_TAG="ChildThread";
    48. publicvoidrun(){
    49. this.setName("ChildThread");
    50. //初始化消息循环队列,需要在Handler创建之前
    51. Looper.prepare();
    52. mChildHandler=newHandler(){
    53. @Override
    54. publicvoidhandleMessage(Messagemsg){
    55. Log.i(CHILD_TAG,"Gotanincomingmessagefromthemainthread-"+(String)msg.obj);
    56. try{
    57. //在子线程中可以做一些耗时的工作
    58. sleep(100);
    59. MessagetoMain=mMainHandler.obtainMessage();
    60. toMain.obj="Thisis"+this.getLooper().getThread().getName()+
    61. ".Didyousendme\""+(String)msg.obj+"\"?";
    62. mMainHandler.sendMessage(toMain);
    63. Log.i(CHILD_TAG,"Sendamessagetothemainthread-"+(String)toMain.obj);
    64. }catch(InterruptedExceptione){
    65. //TODOAuto-generatedcatchblock
    66. e.printStackTrace();
    67. }
    68. }
    69. };
    70. Log.i(CHILD_TAG,"Childhandlerisboundto-"+mChildHandler.getLooper().getThread().getName());
    71. //启动子线程消息循环队列
    72. Looper.loop();
    73. }
    74. }
    75. }

更多相关文章

  1. 做推送,怎么能不了解推送的 4 种消息形式呢?(Android(安卓)篇)
  2. Android:谈一谈安卓应用中的Toast情节(基础)
  3. Android(安卓)Service服务
  4. Android中为什么主线程不会因为Looper.loop()方法造成阻塞
  5. [系统掌握Android] 三步走场景
  6. android socket通信demo (本篇服务于android消息推送)
  7. Android(安卓)学习笔记 - 《第一行代码 Android(安卓)第二版》
  8. Android中有关Handler的使用(一)
  9. Android怎样停止AsyncTask和Thread

随机推荐

  1. Android工程中R.java文件的重新生成——(
  2. 使用Android(安卓)Studio搭建Android集成
  3. 图文详解Android(安卓)Studio搭建Android
  4. 如何搭建Repo服务器端
  5. Android多进程使用及其带来的问题
  6. android多分辨力支持 密度与分辨力
  7. Android手机访问Django测试服务器方法
  8. android耳机状态的检测
  9. Android(安卓)木马应用程序大名单
  10. A015-布局之LinearLayout