解决ANR问题:
子线程:进行耗时操作
|
Handle(将子线程耗时的结果,传递到主线程)
主线程:进行控件更新
Handle
实现步骤
1.获得Hand对象
Handler handler=new Handler();
2.通过handler.sendMessage()将子线程中的数据传递到主线程更新
3.在HandleMessage()中获得子线程耗时下载的结果 ,更新数据到控件
msg.what=2;//区分哪个子线程传递数据给主线程
//从消息池中获取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()
2.非空的View handle 都有 post();
3.非空的View handle 都有 postDelayed(action,time);延迟一段时间后在执行run()
练习:
progressBar自动更新进度 子线程中更新控件
AyncTask (异步任务)
优点:使用方便 要求低
缺点:步骤多
String... params : 可变参数 没有使用的参数 Void表示
实现步骤:
1.创建一个类继承AsyncTask<String, Void, String> 参数:泛型
第一个参数:决定了doInBackground()的传入参数类型
下载网址
第二个参数:决定publishProgress();onProgressUpdate ()传入参数类型名
第三个参数:决定doInBackground()返回值类型
onPostExecute的传入参数类型
2.重写doInBackground//进行耗时操作 执行在子线程 返回耗时结果
3.重写onPostExecute 获得耗时结果 进行控件更新 执行在主线程
4.推送中间进度
5.重写onProgressUpdate()接收中间进度
6.重写onPreExecute()执行再doInbackground()之前
7.启动异步任务
启动异步任务流程
1.启动异步任务
启动异步任务下载图片
注意:添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>