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,如需转载请自行联系原作者
目录
相关文章
|
9月前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
【7月更文挑战第28天】在Android开发中,确保UI流畅性至关重要。多线程与异步编程技术可将耗时操作移至后台,避免阻塞主线程。我们通常采用`Thread`类、`Handler`与`Looper`、`AsyncTask`及`ExecutorService`等进行多线程编程。
101 2
|
25天前
|
监控 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) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
5月前
|
缓存 Java 数据库
Android的ANR原理
【10月更文挑战第18天】了解 ANR 的原理对于开发高质量的 Android 应用至关重要。通过合理的设计和优化,可以有效避免 ANR 的发生,提升应用的性能和用户体验。
196 56
|
9月前
|
Java Android开发
Android面试题经典之Glide取消加载以及线程池优化
Glide通过生命周期管理在`onStop`时暂停请求,`onDestroy`时取消请求,减少资源浪费。在`EngineJob`和`DecodeJob`中使用`cancel`方法标记任务并中断数据获取。当网络请求被取消时,`HttpUrlFetcher`的`cancel`方法设置标志,之后的数据获取会返回`null`,中断加载流程。Glide还使用定制的线程池,如AnimationExecutor、diskCacheExecutor、sourceExecutor和newUnlimitedSourceExecutor,其中某些禁止网络访问,并根据CPU核心数动态调整线程数。
225 2
|
4月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
5月前
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
|
7月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
228 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
6月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
115 4
|
7月前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
在Android开发中,为应对复杂应用场景和繁重计算任务,多线程与异步编程成为保证UI流畅性的关键。本文将介绍Android中的多线程基础,包括Thread、Handler、Looper、AsyncTask及ExecutorService等,并通过示例代码展示其实用性。AsyncTask适用于简单后台操作,而ExecutorService则能更好地管理复杂并发任务。合理运用这些技术,可显著提升应用性能和用户体验,避免内存泄漏和线程安全问题,确保UI更新顺畅。
228 5
|
7月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android应用开发中的多线程编程,涵盖基本概念、常见实现方式及最佳实践。主要内容包括主线程与工作线程的作用、多线程的多种实现方法(如 `Thread`、`HandlerThread`、`Executors` 和 Kotlin 协程),以及如何避免内存泄漏和合理使用线程池。通过有效的多线程管理,可以显著提升应用性能和用户体验。
205 10