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,如需转载请自行联系原作者
目录
相关文章
|
24天前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
51 1
|
1月前
|
Java 调度 Android开发
构建高效Android应用:探究Kotlin多线程编程
【2月更文挑战第17天】 在现代移动开发领域,性能优化一直是开发者关注的焦点。特别是在Android平台上,合理利用多线程技术可以显著提升应用程序的响应性和用户体验。本文将深入探讨使用Kotlin进行Android多线程编程的策略与实践,旨在为开发者提供系统化的解决方案和性能提升技巧。我们将从基础概念入手,逐步介绍高级特性,并通过实际案例分析如何有效利用Kotlin协程、线程池以及异步任务处理机制来构建一个更加高效的Android应用。
41 4
|
1月前
|
API 数据库 Android开发
构建高效Android应用:探究Kotlin多线程优化策略
【2月更文挑战第14天】随着移动设备性能的日益强大,用户对应用程序的响应速度和流畅性要求越来越高。在Android开发中,合理利用多线程技术是提升应用性能的关键手段之一。Kotlin作为一种现代的编程语言,其协程特性为开发者提供了更为简洁高效的多线程处理方式。本文将深入探讨使用Kotlin进行Android多线程编程的最佳实践,包括协程的基本概念、优势以及在实际项目中的应用场景和性能优化技巧,旨在帮助开发者构建更加高效稳定的Android应用。
|
3月前
|
Java 调度 数据库
Android 性能优化: 如何进行多线程编程以提高应用性能?
Android 性能优化: 如何进行多线程编程以提高应用性能?
47 0
|
3月前
|
安全 Android开发 开发者
【Android开发小技巧】扔掉这坑人的 Handler
【Android开发小技巧】扔掉这坑人的 Handler
40 0
|
3天前
|
移动开发 Java Unix
Android系统 自动加载自定义JAR文件
Android系统 自动加载自定义JAR文件
21 1
|
3天前
|
Shell Android开发 开发者
Android系统 自定义动态修改init.custom.rc
Android系统 自定义动态修改init.custom.rc
23 0
|
3天前
|
存储 安全 Android开发
Android系统 自定义系统和应用权限
Android系统 自定义系统和应用权限
19 0
|
13天前
|
Java API 调度
安卓多线程和并发处理:提高应用效率
【4月更文挑战第13天】本文探讨了安卓应用中多线程和并发处理的优化方法,包括使用Thread、AsyncTask、Loader、IntentService、JobScheduler、WorkManager以及线程池。此外,还介绍了RxJava和Kotlin协程作为异步编程工具。理解并恰当运用这些技术能提升应用效率,避免UI卡顿,确保良好用户体验。随着安卓技术发展,更高级的异步处理工具将助力开发者构建高性能应用。
|
24天前
|
安全 Linux API
Android进程与线程
Android进程与线程
18 0