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,如需转载请自行联系原作者
目录
相关文章
|
12月前
|
存储 SQL 安全
Android面试中问的线程相关问题
Android面试中问的线程相关问题
64 0
|
12月前
|
数据库 Android开发
android 如何调查并解决 ANR
android 如何调查并解决 ANR
64 0
|
4月前
|
XML Java Android开发
Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信)
Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信)
318 0
|
10月前
|
监控 安全
并发编程系列教程(06) - 多线程之间通讯(wait、notify、sleep、Lock锁、Condition)
并发编程系列教程(06) - 多线程之间通讯(wait、notify、sleep、Lock锁、Condition)
52 0
|
1月前
|
设计模式 安全 Java
Java多线程通讯
这些机制都是多线程通信的关键,使用它们可以在Java中实现高效、安全的线程协作。在实现多线程通信时,需注意死锁、饥饿、竞态条件等多线程问题。确保对多线程的理解深入和正确的设计模式应用将会是编写稳健多线程程序的基础。
11 0
|
2月前
|
算法 Java API
Android性能优化面试题经典之ANR的分析和优化
Android ANR发生于应用无法在限定时间内响应用户输入或完成操作。主要条件包括:输入超时(5秒)、广播超时(前台10秒/后台60秒)、服务超时及ContentProvider超时。常见原因有网络、数据库、文件操作、计算任务、UI渲染、锁等待、ContentProvider和BroadcastReceiver的不当使用。分析ANR可借助logcat和traces.txt。主线程执行生命周期回调、Service、BroadcastReceiver等,避免主线程耗时操作
49 3
|
4月前
|
Android开发 Kotlin API
Android插件化探索与发现,kotlin协程切换线程
Android插件化探索与发现,kotlin协程切换线程
|
4月前
|
消息中间件 安全 数据处理
Android之Handler、Message、MessageQueue、Looper详解2
Android之Handler、Message、MessageQueue、Looper详解
59 0
|
4月前
|
Java Android开发
Android之Handler、Message、MessageQueue、Looper详解1
Android之Handler、Message、MessageQueue、Looper详解
49 0
|
4月前
|
安全 Linux API
Android进程与线程
Android进程与线程
42 0