Android:线程间通讯、Handler、Looper、IntentService、自定义消息队列

简介:

Android:线程间通讯、Handler、Looper、IntentService


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
public  class  MainActivity  extends  Activity  implements  OnClickListener
{
     private  Handler mHandler;
     private  TextView textView;
        
     /**
      * 1.继承ItentService类的public myservice()构造方法必须存在 
      * 2.如果已经startservice,再次start的话,会调用onbindservice
      * 3.线程深入封装:HandlerThread和IntentService
      * 4.IntentService:
      *   class MyService extends IntentService
      *   {
      *      public MyService()
      *      {
      *          super("xxx");
      *      }
      *      onHandleMessage()
      *      {
      *          // 在"xxx"线程处理耗时操作
      *      }
      *      onBind()
      *   }      
      */
        
     @Override
     protected  void  onCreate(Bundle savedInstanceState)
     {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
            
         findViewById(R.id.button1).setOnClickListener( this );
         findViewById(R.id.button2).setOnClickListener( this );
         findViewById(R.id.button3).setOnClickListener( this );
         textView = (TextView) findViewById(R.id.textView1);
     }
        
     @Override
     public  boolean  onCreateOptionsMenu(Menu menu)
     {
         getMenuInflater().inflate(R.menu.activity_main, menu);
         return  true ;
     }
     @Override
     public  void  onClick(View v)
     {
         switch  (v.getId())
         {
         case  R.id.button1:
             btn1Click();
             break ;
         case  R.id.button2:
             btn2Click();
             break ;
         case  R.id.button3:
             btn3Click();
             break ;
            
         default :
             break ;
         }
     }
     private  void  btn3Click()
     {
         new  Thread( "子线程2" )
         {
             @Override
             public  void  run()
             {
                 Message msg =  new  Message();
                 msg.obj =  30 ;
                 mHandler.sendMessage(msg);
             }
         }.start();
     }
     private  void  btn2Click() //将main线程消息发送给子线程
     {
            
         Message msg =  new  Message();
         msg.arg2 =  20 ;
         mHandler.sendMessage(msg);
     }
     private  void  btn1Click() //启动自定义消息队列
     {
         try
         {
             Thread.sleep( 5000 );
         }
         catch  (InterruptedException e)
         {
             e.printStackTrace();
         }
         new  Thread( "子线程" )
         {
             @Override
             public  void  run()
             {
                 Looper.prepare(); //创建Looper和MessageQueue两个对象
                 mHandler =  new  Handler() //由Looper决定哪个线程来执行Handler
                 {
                     public  void  handleMessage(android.os.Message msg)
                     {
                         String threadname = Thread.currentThread().getName();
                         Log.e( "handler" "threadname:"  + threadname +  " msg_1:"  + msg.arg1 +  " msg_main:"  + msg.arg2 +  " msg_2:"  + msg.obj); //可以接收到消息,自己给自己发送消息
                     };
                 };
                    
                 Message msg =  new  Message();
                 msg.arg1 =  10 ;
                 mHandler.sendMessage(msg);
                    
//                mHandler.sendEmptyMessage(1);
                    
                 Looper.loop(); //在该线程中运行消息
             }
         }.start();
     }
        
}




注:

1.结束子线程的方法:设置一个flag标记进行判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
     private  void  saveCityInfo( final  HttpHelperResponse response)
     {
         new  Thread( new  Runnable()
         {
             @Override
             public  void  run()
             {
                 while  (!isThreadOver)
                 {
                     Looper.prepare();
                     CityInfoList cityInfo = HBJsonUtils.parseAllCityInfoJson(response.getMsgStr()); // 解析
                     // 将下载结果写入缓存
                     mDBHelper.addToCache(cityInfo, mCityId);
                     
                     // 释放
                     recycleCityInfoList(cityInfo);
                     
                     handler.sendEmptyMessage(MSG_SAVE_CITYINFO);
                     Looper.loop();
                 }
             }
         }).start();
     }




本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1210685,如需转载请自行联系原作者
目录
打赏
0
0
0
0
235
分享
相关文章
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
85 1
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
110 4
Android消息处理机制(Handler+Looper+Message+MessageQueue)
Android消息处理机制(Handler+Looper+Message+MessageQueue)
152 2
Android的三种网络通讯方式详解
Android平台有三种网络接口可以使用,他们分别是:java.net.*(标准Java接口)、Org.apache接口和Android.net.*(Android网络接口)。下面分别介绍这些接口的功能和作用。
2627 0
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
105 19
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
76 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
203 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等