关于UI在主线程操作的问题(handler和AsyncTask)
来源:互联网 发布:教师培训网络课程平台 编辑:程序博客网 时间:2024/05/01 09:45
UI的更新只能在主线程进行更新:
在不使用handler的情况,之所以可以在适配器adapter上进行UI的更新:
holder.tv_subject.setText(list.get(position).getSubject());
holder.tv_summary.setText(list.get(position).getSummary());
holder.tv_changed.setText(list.get(position).getChanged());
holder.iv.setImageBitmap(bm);
是因为在adapter是在主线程进行setAdapter和New的,所以adapter就是在主线程中。相当于在主线程中UI的更新。
在异步任务中,只有doInBackground方法不在主线程中,因为其进行耗时操作。其他都是在主线程中。
------------------------------------------------------------------------------------------------------------
在使用handler的情况下:
holder.iv.setImageResource(R.mipmap.ic_launcher);
final String imagePath=list.get(position).getCover();
//下载图片
new Thread(new Runnable() {
@Override
public void run() { // 开启一个子线程就可以取代LoadImageAsyncTask下载图片,简单方便
if(HttpUtils.isNetWorkConn(context)){
byte[] buff=HttpUtils.getHttpResult(imagePath);
final Bitmap bm= BitmapFactory.decodeByteArray(buff,0,buff.length);
handler.post(new Runnable() { //之所以要使用handler而不直接 holder.iv.setImageBitmap(bm); 是因为开启了一个子线程,子线程不能进行UI的更新,需要使用handler将信息回传到主线程中,于是就使用了:
handler.post(new Runnable() {
@Override
public void run() {
holder.iv.setImageBitmap(bm);
}
});
@Override
public void run() {
holder.iv.setImageBitmap(bm);
}
});
}
}
}).start();
holder.tv_subject.setText(list.get(position).getSubject());
holder.tv_summary.setText(list.get(position).getSummary());
holder.tv_changed.setText(list.get(position).getChanged());
---------------------------------------------------------------------------------------------------------------------------------------------------
在AsyncTask中,onPostExecute(List<Books> result) 和doInBackground(String... params)
其中:
doInBackground(String... params),为后台的耗时操作。方法publishProgress()可更新任务进度。
onPostExecute(List<Books> result),为UI主线程调用,展示任务进度
onPreExecute(),一般用来展示进度条
AsyncTask详细
1 0
- 关于UI在主线程操作的问题(handler和AsyncTask)
- 关于在UI中刷新主线程的问题
- 子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么?
- android4.4中关于不能再主线程下载和在主线程中更新UI的矛盾
- Android 关于非主线程不能操作UI的认识
- 关于非主线程中操作ui的实现
- 15/9/9/Handler主线程和子线程之间的通讯/AsyncTask
- 运用AsyncTask在主线程更新图片UI
- 不要在UI主线程中进行耗时的操作
- android 的Handler处理UI主线程外的耗时操作
- 在非Activity(非主线程)中更新UI的办法:(一)Handler+Thread+Activity静态成员变量
- 在非Activity(非主线程)中更新UI的办法:(二)Handler+接口回调
- 在主线程的handler里开子线程 主线程会卡主
- android学习记录(十一)在非主线程实现更新ui------------Handler
- Android在非UI主线程操作UI的简单方法
- 关于主线程中耗时操作的问题
- 关于主线程中耗时操作的问题
- androd中主线程和非主线程的通信机制(Handler/Looper/Message)
- iOS上传视频到服务器
- Spring Boot 快速入门
- 我的见解之hibernate(六)
- linux centos 命令行 安装 teamviewer 启动 停止
- 系统拆分解耦利器之消息队列---RabbitMQ-发布/订阅
- 关于UI在主线程操作的问题(handler和AsyncTask)
- JSTL
- $.extend() 参数
- Maven的settings.xml文件结构之profiles
- 8.5 子模块分析之VDIC
- jsp的config对象浅析。
- 直播干货来袭,RTMPCHybridEngine颠覆传统直播
- POJ 2891 Strange Way to Express Integers(一元线性同余方程组)
- NPOI 设置Excel样式