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消息处理机制(Handler+Looper+Message+MessageQueue)
Android消息处理机制(Handler+Looper+Message+MessageQueue)
189 2
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
116 4
Android消息处理机制(Handler+Looper+Message+MessageQueue)
Android消息处理机制(Handler+Looper+Message+MessageQueue)
88 2
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
在Android开发中,为应对复杂应用场景和繁重计算任务,多线程与异步编程成为保证UI流畅性的关键。本文将介绍Android中的多线程基础,包括Thread、Handler、Looper、AsyncTask及ExecutorService等,并通过示例代码展示其实用性。AsyncTask适用于简单后台操作,而ExecutorService则能更好地管理复杂并发任务。合理运用这些技术,可显著提升应用性能和用户体验,避免内存泄漏和线程安全问题,确保UI更新顺畅。
229 5
|
2月前
|
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
67 17
|
2月前
|
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
67 26
【JavaEE】多线程编程引入——认识Thread类
Thread类,Thread中的run方法,在编程中怎么调度多线程
|
4月前
|
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
360 2
AI助理

你好,我是AI助理

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