Android——多线程之Handler
Why?
因为在Android系统中UI操作并不是线程安全的,如果多个线程并发的去操作同一个组件,可能导致线程安全问题。为了解决这一个问题,
android制定了一条规则:只允许UI线程来修改UI组件的属性等,也就是说必须单线程模型,这样导致如果在UI界面进行一个耗时叫长的数据
更新等就会形成程序假死现象 也就是ANR异常,如果20秒中没有完成程序就会强制关闭。所以比如另一个线程要修改UI组件的时候,
就需要借助Handler消息机制了。
Use Status?
1.在新启动的线程中发送给消息
2.在主线程获取、处理消息
Handler 的执行过程
角色描述:
1) Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue
2) Handler: 你可以构造Handler对象来与Looper沟通,以便push 新消息到 Message Queue里,或者
接收Looper从Message Queue 里所送来的消息。
3)Message Queue(消息队列):是用来存放线程放入的消息。
4)线程:UI thread 通常就是 main thread,而Android 启动程序时会替它建立一个Message Queue。
每一个线程里可含有一个 Looper 对象以及一个 Message Queue 数据结构。在你的应用程序里,
可以定义 Handler 的子类别来接收 Looper 所送出的消息。
Detail?
Handle发送和处理消息的几个方法:
1. void handleMessage( Message msg):处理消息的方法,该方法通常被重写。
2.final boolean hasMessage(int what):检查消息队列中是否包含有what属性为指定值的消息
3.final boolean hasMessage(int what ,Object object) :检查消息队列中是否包含有what好object属性指定值的消息
4.sendEmptyMessage(int what):发送空消息
5.final Boolean send EmptyMessageDelayed(int what ,long delayMillis):指定多少毫秒发送空消息
6.final boolean sendMessage(Message msg):立即发送消息
7.final boolean sendMessageDelayed(Message msg,long delayMillis):多少秒之后发送消息
Demo:
private static String image_path = "http://ww4.sinaimg.cn/bmiddle/786013a5jw1e7akotp4bcj20c80i3aao.jpg";private ImageView imageView_1;private Button button_1;private Button button_2;//Handler定义并重写handleMessage方法private Handler handler = new Handler() {@Overridepublic void handleMessage(android.os.Message msg) {if (msg.what == 1) {System.out.println(">>>>>STEP2");byte[] data = (byte[]) msg.obj;Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);imageView_1.setImageBitmap(bmp);}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_choose);button_1 = (Button) findViewById(R.id.Yes);imageView_1 = (ImageView) findViewById(R.id.imageView);button_1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {new Thread(new Runnable() {@Overridepublic void run() {HttpClient httpClient = new DefaultHttpClient();HttpGet httpGet = new HttpGet(image_path);HttpResponse httpResponse = null;try{Thread.sleep(10000);httpResponse = httpClient.execute(httpGet);byte[] data = EntityUtils.toByteArray(httpResponse.getEntity());//定义Message,并把Message传给HandlerMessage msg = Message.obtain();msg.what=1;msg.obj=data;System.out.println(">>>>>STEP1");handler.sendMessage(msg);} catch(Exception e){e.printStackTrace();}}}).start();}}); }
效果:
参考博客: http://blog.csdn.net/x605940745/article/details/13001279
http://www.cnblogs.com/youxilua/archive/2011/11/25/2263825.html
转载于:https://www.cnblogs.com/udld/p/4313973.html
Android——多线程之Handler相关推荐
- Android–多线程之Handler下载图片源码
Android的消息传递机制是另外一种形式的"事件处理",这种机制主要是为了解决Android应用中多线程的问题,在Android中不允许Activity新启动的线程访问该Acti ...
- Android 多线程之Handler
前言 Android的消息传递机制是另外一种形式的"事件处理",这种机制主要是为了解决Android应用中多线程的问题,在Android中不允许Activity新启动的线程访问该A ...
- Android多线程之IntentService源码解析
想要了解 IntentService 的工作原理需要先对 Android 系统中以 Handler.Looper.MessageQueue 组成的异步消息处理机制以及 HandlerThread 有所 ...
- Android 多线程之IntentService 完全详解
转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52426425 出自[zejian的博客] 关联文章: Android ...
- Android 多线程之HandlerThread 完全详解
转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52426353 出自[zejian的博客] 关联文章: Android ...
- Android多线程之ArrayBlockingQueue源码解析
阻塞队列系列 Android多线程之LinkedBlockingQueue源码解析 Android多线程之SynchronousQueue源码解析 Andorid多线程之DelayQueue源码分析 ...
- Android--多线程之Handler
原文:https://www.cnblogs.com/plokmju/p/android_Handler.html 前言 Android的消息传递机制是另外一种形式的"事件处理", ...
- android handlerthread 线程管理,Android多线程之HandlerThread源码解析
一.概述 先来了解一下HandlerThread的几个特性 HandlerThread继续于Thread,本身就是一个线程类 HandlerThread在内部维护了自己的Looper对象,所以可以进行 ...
- android handlerthread 线程管理,Android线程之HandlerThread
概述 HandlerThread是Thread的一个子类,是Android中提供的另一种线程形态. Handy class for starting a new thread that has a l ...
- linux 线程pthread_detach,linux线程之pthread_join和pthread_detach
在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...
最新文章
- 快速排序原理及代码模板
- java内部类的特点
- Python学习6——条件,循环语句
- AVB2 avbtool.py脚本常用命令
- 关于家庭无线局域网的连接
- 高通侧目!联发科发布面向高端手机的5G芯片
- 开源老兵教你如何评估一项技术是否值得长期投入?
- java兵临城下_再谈java事件监听机制
- [hdu 1003] Max Sum
- iOS申请真机调试证书-图文详解
- Windows客户端开发--URLDownloadToFile下载文件进度条
- html 数据交互动画,纯css实现可交互的动画
- mybatis (高级映射 缓存 延迟加载)
- 小米路由器3G建站折腾笔记4 - 安装opkg和onmp
- Mac浏览器有好多种,那么哪款好用呢?
- 我的世界未能从服务器注册表数据,【经验之谈】“User Profile Service 服务未能登录,无法加载用户配置文件”实战历程...
- 王者荣耀角色信息在哪个服务器,怎么查询王者荣耀角色在哪个区
- Fragment销毁自己
- php 获取pr,获取网站 百度权重 搜狗 谷歌PR
- 阿里云BaaS下蚂蚁区块链开发实践(一)