解决ANR问题:

子线程:进行耗时操作

            |

 Handle(将子线程耗时的结果,传递到主线程)

主线程:进行控件更新

Handle

实现步骤

1.获得Hand对象

Handler handler=new Handler();

2.通过handler.sendMessage()将子线程中的数据传递到主线程更新

spacer.gif

3.在HandleMessage()中获得子线程耗时下载的结果 ,更新数据到控件

spacer.gif

msg.what=2;//区分哪个子线程传递数据给主线程

spacer.gif

//从消息池中获取message对象  性能上优化

 Message msg = handler.obtainMessage();

handler.sendEmptyMessage(what);//发送空消息

// handler.sendMessageDelayed(msg, 4000);//延迟一段时间后再发送消息

Message message = handler.obtainMessage(1, 1, 2, str);//封装消息

handler.sendMessage(message);

简单更新控件的方法

1.RunOnUIThread()

spacer.gif

2.非空的View handle 都有 post();

spacer.gif

spacer.gif

3.非空的View handle 都有 postDelayed(action,time);延迟一段时间后在执行run()

spacer.gif

练习:

progressBar自动更新进度    子线程中更新控件

AyncTask (异步任务)

优点:使用方便 要求低

缺点:步骤多

String... params : 可变参数   没有使用的参数 Void表示

实现步骤: 

1.创建一个类继承AsyncTask<String, Void, String>  参数:泛型

第一个参数:决定了doInBackground()的传入参数类型   

 下载网址  

第二个参数:决定publishProgress();onProgressUpdate ()传入参数类型名

第三个参数:决定doInBackground()返回值类型

                   onPostExecute的传入参数类型  

2.重写doInBackground//进行耗时操作   执行在子线程   返回耗时结果

spacer.gif

3.重写onPostExecute  获得耗时结果   进行控件更新    执行在主线程

spacer.gif

4.推送中间进度  

spacer.gif

5.重写onProgressUpdate()接收中间进度

spacer.gif

6.重写onPreExecute()执行再doInbackground()之前

spacer.gif

7.启动异步任务

spacer.gif

启动异步任务流程

1.启动异步任务

spacer.gif

启动异步任务下载图片

注意:添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

spacer.gif