(原)Android理论梳理-No1异步处理之Handler相关机制
1 Handler的基本概念:
什么是handler?
Handler是安卓系统的一种回调机制。
handler的作用?
他的作用是用于不同线程之间的通讯。一是可以用于子线程与UI线程的数据通信,因为只有UI线程可以更新UI,子线程如果想要更新界面就需要用Handler通过发送Message来更新UI,而UI线程在handlerMessage方法中处理传过来的Message数据。二是可以用于Handler绑定的线程延迟发送消息。
2 那么为什么只有UI线程才能更新UI呢?
主要是为了解决多线程并发的问题。如果所有的线程都能更新UI,为了解决并发问题,线程会对UI对象进行加锁,那可能出现死锁现象导致界面卡住。另外只有UI线程进行更新也让设计和编程更简单。
3 Handler、Looper和MessageQueue之间的关系?
Handler负责向绑定的Looper发送消息。而MessageQueue是Looper内部的一个消息队列容器,Looper用MessageQueue消息队列来装载这些消息,并通过一个死循环方法Looper.loop从消息队列中取出消息并通过dispatchMessage方法把取出的消息发送给handlerMessage方法来进行处理。
4 能在子线程直接更新UI吗?
在网上能看到很多文章说android里子线程不能刷新UI。其实线程能否刷新UI的关键在于ViewRoot是否属于该线程。而实际上子线程在特定情况下是可以刷新UI的。ViewRoot实例要通过ViewRootImpl()方法来创建,在Activity.onResume前,ViewRoot实例没有建立,所以没有ViewRoot.checkThread检查。所以在onCreate方法的早期是可以在子线程更新UI的。
如下面例子:
public class MainActivity extends Activity {
TextView textView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView1 = (TextView) findViewById(R.id.textView1);
new Thread(new Runnable() {
public void run() {
textView1.setText("子线程更新UI");
}
}).start();
}
}
(原)Android理论梳理-No1异步处理之Handler相关机制的更多相关文章
- Android:异步处理之Handler、Looper、MessageQueue之间的恩怨(三)
前言 如果你在阅读本文之前,你不知道Handler在Android中为何物,我建议你先看看本系列的第一篇博文<Android:异步处理之Handler+Thread的应用(一)>:我们都知 ...
- Android 知识梳理
说明:本篇博客只是一个知识整理,因为网上对于Android的知识介绍足够多,因此我不再写相关文章(主要是因为我写的不如人家好),所以所有文章均来自网络,不贴原文章,只提供连接,因此本文旨在减少你对相关 ...
- Android引入高速缓存的异步加载全分辨率
Android引进高速缓存的异步加载全分辨率 为什么要缓存 通过图像缩放,我们这样做是对的异步加载优化的大图,但现在的App这不仅是一款高清大图.图.动不动就是图文混排.以图代文,假设这些图片都载入到 ...
- Android Asynchronous Http Client-Android异步网络请求客户端接口
1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用and ...
- [原]Android打包之Eclipse打多渠道包
Android自动打包流程详细图: 步骤一和步骤二参考:[原]Android打包之Eclipse打包 步骤三:编写build.xml <?xml version="1.0" ...
- android开启线程,异步处理数据实例
package com.example.sywang2; import com.zds.os.R; import android.os.Bundle; import android.os.Handle ...
- Android中的AsyncTask异步任务的简单实例
在 Android中的AsyncTask异步任务的简介 一文中.已经对 安卓 异步任务操作做了简单的介绍.这里,直接将上文中的异步任务做了一个实例.实现异步操作更新UI线程,相比开启子线程更新来说逻辑 ...
- [原]Android开发环境搭建
[Date]2014-04-20 [Author]wintys (wintys@gmail.com) http://wintys.cnblogs.com [Keywords]android . 离线a ...
- Android全面解析之由浅及深Handler消息机制
前言 很高兴遇见你~ 欢迎阅读我的文章. 关于Handler的博客可谓是俯拾皆是,而这也是一个老生常谈的话题,可见的他非常基础,也非常重要.但很多的博客,却很少有从入门开始介绍,这在我一开始学习的时候 ...
随机推荐
- win7 IIS7环境下部署PHP 7.0
最近在本机电脑win7 II7环境下部署PHP 7.0遇到一些问题,将之记录下来 简要步骤如下: 1.到php官网下载php,由于是IIS环境要下载非线程安全的版本,我下载的是7.0.13 2.解压到 ...
- (实用篇)浅谈PHP拦截器之__set()与__get()的理解与使用方法
"一般来说,总是把类的属性定义为private,这更符合现实的逻辑. 但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数"__get()"和&q ...
- 从输入 URL 到浏览器接收的过程中发生了什么事情
从输入 URL 到浏览器接收的过程中发生了什么事情? 原文:http://www.codeceo.com/article/url-cpu-broswer.html 从触屏到 CPU 首先是「输入 U ...
- phpstorm10.0.1 注册
注册时选择License server,填http://idea.lanyus.com,然后点击OK,就注册了
- Weblogic新增域(可以配置新端口)
操作系统 :Linux version 2.6.32-504.el6.x86_64 Weblogic Server :11g 一.Weblogic新增域(可以配置新端口) 以weblogic用户登录 ...
- selenium 常见问题整理。
一:日期控件 selenium不能直接对日期控件操作,可以通过js对日期控件做赋值操作 WebElement inputTimeBox=driver.findElement(by.name(" ...
- SQL Server COM 组件创建实例失败
SQL Server COM 组件创建实例失败 SQL2008数据库总会出现从 IClassFactory 为 CLSID 为 {17BCA6E8-A95D-497E-B2F9-AF6AA4759 ...
- NSLog 自定义 屏蔽
1.如何自定义NSLog呢? 直接在工程的XXX_Prefix.pch中加入以下语句(就相当于在全局中定义了)#define NSLog NSLog(@"#%s##%d#",str ...
- 手机端touch事件 jquery模拟
ontouchstart实现手机触屏中的hover效果 ontouchstart实现手机触屏中的hover效果 最近一直都在做手机网站的项目,会经常遇到手机屏幕触摸无交互效果,今天在一篇文章中看到模拟 ...
- UML类图分析
继承: 实现: 关联: 依赖: 组合: 聚合: