Android:ANR、线程间通讯、Handler、Message

简介:

场景:点击按钮1进行下载,显示进度条进度变化,10秒后下载完成,进度条消失;点击按钮2完成更新,出现转动进度条,5秒后更新完毕进度条消失。

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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
public  class  MainActivity  extends  Activity  implements  OnClickListener
{
     TextView textView =  null ;
     private  ProgressBar mProgress_yuan;
     private  ProgressBar mProgress_jindu;
     private  final  int  MSG_WHAT_DOWNLOAD =  1 ;
     private  final  int  MSG_WHAT_UPDATE =  2 ;
     private  final  int  MSG_WHAT_PROGRESS =  3 ;
                   
     private  Handler mHandler =  new  Handler() // Handler运行于main线程,在main线程接收消息
     {
         @Override
         public  void  handleMessage(Message msg) // 重写handleMessage方法
         {
             switch  (msg.what)
             {
             case  MSG_WHAT_DOWNLOAD:
                 Data data = (Data) msg.obj;
                 textView.setText(data.toString());
                 mProgress_jindu.setVisibility(View.GONE); // 下载完成后,进度条消失
                 break ;
                           
             case  MSG_WHAT_UPDATE:
                 String str = (String) msg.obj;
                 textView.setText(str);
                 mProgress_yuan.setVisibility(View.GONE); // 更新完毕后,圆形进度框消失
                 break ;
             case  MSG_WHAT_PROGRESS:
                 int  arg = msg.arg1;
                 mProgress_jindu.setProgress(arg); // 每次接收消息,更新进度条
                 break ;
                           
             default :
                 break ;
             }
         }
     };
                   
     @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 );
         textView = (TextView) findViewById(R.id.textView1);
         mProgress_yuan = (ProgressBar) findViewById(R.id.progressBar1);
         mProgress_jindu = (ProgressBar) findViewById(R.id.progressBar2);
     }
                   
     @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 ;
                       
         default :
             break ;
         }
     }
                   
     private  void  btn1Click() // 点击下载,10秒后下载完成,进度条消失
     {
         mProgress_jindu.setVisibility(View.VISIBLE); // 点击时进度条显示(xml设置默认隐藏)
         new  Thread()
         {
             @Override
             public  void  run()
             {
                 Message message =  new  Message();
                 message.what = MSG_WHAT_DOWNLOAD;  // 设置标识
                 message.obj = download(); // 将返回结果赋给msg,调用下载方法时同时发消息更新进度条
                 mHandler.sendMessage(message); // 通过Handler传递msg
             }
         }.start();
                       
     }
                   
     private  void  btn2Click() // 点击更新,圆形进度条转动,3秒后更新完成,进度条消失
     {
         mProgress_yuan.setVisibility(View.VISIBLE);
         new  Thread()
         {
             @Override
             public  void  run()
             {
                 try
                 {
                     Thread.sleep( 3000 );
                     String str = update();
                                   
                     //Message msg = mHandler.obtainMessage(what, obj)
                     //下面部分可以采用上面的方法优化
                     Message msg =  new  Message();
                     msg.what = MSG_WHAT_UPDATE;
                     msg.obj = str;
                     mHandler.sendMessage(msg);
                 }
                 catch  (InterruptedException e)
                 {
                     e.printStackTrace();
                 }
             }
         }.start();
     }
                   
     private  Data download()
     {
         for  ( int  i =  0 ; i <  10 ; i++) // 模拟下载进度过程
         {
             //Message msg = new Message();
             Message msg = mHandler.obtainMessage(); //从系统的资源池获取复用msg,避免重复创建msg对象
             msg.what = MSG_WHAT_PROGRESS;
             msg.arg1 = i *  10 ;
             mHandler.sendMessage(msg); // 每次进度发消息给main线程更新进度条
             try
             {
                 Thread.sleep( 1000 ); // 10秒后下载完成
             }
             catch  (InterruptedException e)
             {
                 e.printStackTrace();
             }
         }
         Data data =  new  Data( "下载完成!" 12 );
         return  data;
     }
                   
     private  String update()
     {
         return  "更新完成!" ;
     }
                   
     class  Data
     {
         String name;
         int  num;
                       
         public  Data(String name,  int  num)
         {
             super ();
             this .name = name;
             this .num = num;
         }
                       
         @Override
         public  String toString()
         {
             return  "data [name="  + name +  ", num="  + num +  "]" ;
         }
                       
     }
}




本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1206262,如需转载请自行联系原作者
目录
相关文章
|
消息中间件 存储 Java
Android消息处理机制(Handler+Looper+Message+MessageQueue)
Android消息处理机制(Handler+Looper+Message+MessageQueue)
318 2
|
消息中间件 Android开发
Android Handler的使用方式以及其机制的简单介绍
Handler 是 Android 中实现线程间通信的重要机制,可传递任意两线程数据。常用场景包括子线程向主线程(UI 线程)传递结果,以及主线程向子线程发送消息。其核心涉及四个类:Handler(发送/接收消息)、Message(消息载体)、MessageQueue(消息队列)和 Looper(消息循环泵)。基本流程为:Handler 发送 Message 至 MessageQueue,Looper 从队列中按 FIFO 取出并处理。
404 0
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
10455 2
|
缓存 Java 数据库
Android的ANR原理
【10月更文挑战第18天】了解 ANR 的原理对于开发高质量的 Android 应用至关重要。通过合理的设计和优化,可以有效避免 ANR 的发生,提升应用的性能和用户体验。
846 56
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
742 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
317 4
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
449 1

热门文章

最新文章