学习通过Thread+Handler实现非UI线程更新UI组件
【Android线程机制】
出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题。为了解决这个问题,Android制定了一条简单的规则:只允许UI线程修改Activity里的UI组件
当一个程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如用户的按键事件,用户接触屏幕的事件及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程
【Handler类简介】
Handler类主要作用有两个:
-->在新启动的线程发送消息
-->在主线程中获取、处理消息
【原理】
为了让线程能“适时”地处理新启动的线程所发送的消息,显然只能通过回调的方法来实现---开发者只需要重写Handler类中的处理消息的方法,当新启动的线程发送消息时,消息会发送到与之关联的MessageQueue,而Handler会不断地从MessageQueue中获取并处理消息-这将导致Handler类中的处理消息的方法被回调
【Handler类中用于发送和处理消息的方法 】
. void handleMessage(Message msg): 处理消息的方法。该方法通常用于被重写
. final boolean hasMessages(int what): 检查消息队列中是否包含what属性为指定值的消息
. final boolean hasMessages(int what,Object object) : 检查消息队列中是否包含what属性为指定值
的消息且object属性为指定对象的消息
. 多个重载的Message obtainMessage(): 获取消息
. sendEmptyMessage(int what): 发送空消息
. final boolean sendEmptyMessageDelayed(int what,long delayMills): 指定多少秒后发送空消息
. final boolean sendMessage(Message msg): 立即发送消息
. final boolean sendMessageDelayed(Message msg,long delayMills): 指定多少秒后发送消息
-----------------------------------------------------------------------------------------------------------------
下面通过一个例子实现Android线程操作机制
eg:通过点击按钮,来实现异步加载csdn的logo
效果图:

【代码】
package cn.edu.bzu.asynchronous_processomg; import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient; import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast; /**
* 学习通过Thread+Handler实现非UI线程更新UI组件
* 学习异步加载的使用
* @author monster
* date:2015-05-28
* introduce : Android只允许UI线程修改Activity里的UI组件
* Aim:点击按钮读取CSDN网站的LOGO
*/
public class MainActivity extends Activity {
private Button mButton;
private ImageView mImageView; private final static int MSG_SUCCESS = 0; //获取图片成功的标识
private final static int MSG_FAILURE = 1; //获取图片失败的标识 private Thread mThread; private Handler mHandler=new Handler(){
public void handleMessage(Message msg){ //此方法在UI线程中运行
switch(msg.what){
case MSG_SUCCESS:
mImageView.setImageBitmap((Bitmap)msg.obj); //得到obj,并且强制类型转换成Bitmap类型--->>>obj含有图片的信息
Toast.makeText(getApplication(), "success", Toast.LENGTH_LONG).show();
break;
case MSG_FAILURE:
Toast.makeText(getApplication(), "error", Toast.LENGTH_LONG).show();
break;
}
} };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化控件的时候,如果为当前上下文的时候,则不需要写上下文
mButton=(Button)findViewById(R.id.mButton);
mImageView=(ImageView)findViewById(R.id.mImageView); mButton.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
if(mThread==null){
mThread=new Thread(runnable);
mThread.start();
}
}
});
}
Runnable runnable=new Runnable() { @Override
public void run() {
//run()在新的线程中运行
HttpClient hc=new DefaultHttpClient();
HttpGet hg=new HttpGet("http://csdnimg.cn/www/images/csdnindex_logo.gif"); //csdn 的logo
final Bitmap bm;
try {
HttpResponse hr=hc.execute(hg); // 响应做出的请求
bm=BitmapFactory.decodeStream(hr.getEntity().getContent());
} catch (Exception e) {
mHandler.obtainMessage(MSG_FAILURE).sendToTarget();//获取图片失败
return ;
}
mHandler.obtainMessage(MSG_SUCCESS,bm).sendToTarget();//获取图片成功
}
}; @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }
【总结】
Handle在代码中为一个主线程,Runnable为一个新线程,新线程中通过请求响应的方法得到网站的logo,然后通过Handle消息传递机制进行传递从网站中读取的图片,这个图片为一个bitmap,是通过把文件流转换成bitmap,然后进行消息传递
【链接分享】
http://blog.csdn.net/mylzc/article/details/6736988
【源代码下载地址】
https://github.com/monsterLin/Asy_Processing
学习通过Thread+Handler实现非UI线程更新UI组件的更多相关文章
- 学习通过Thread+Handler实现非UI线程更新UI组件(转)
[Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍 ...
- Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面
目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+L ...
- Winform非UI线程更新UI界面的各种方法小结
我们知道只有UI线程才能更新UI界面,其他线程访问UI控件被认为是非法的.但是我们在进行异步操作时,经常需要将异步执行的进度报告给用户,让用户知道任务的进度,不至于让用户误认为程序“死掉了”,特别是对 ...
- 非UI线程更新UI界面的各种方法小结
转载:https://www.cnblogs.com/xiashengwang/archive/2012/08/18/2645541.html 我们知道只有UI线程才能更新UI界面,其他线程访问UI控 ...
- WPF 非UI线程更新UI界面的各种方法小结
转载:https://www.cnblogs.com/bdbw2012/articles/3777594.html 我们知道只有UI线程才能更新UI界面,其他线程访问UI控件被认为是非法的.但是我们在 ...
- android 在非UI线程更新UI仍然成功原因深入剖析
”只能在UI主线程中更新View“. 这句话很熟悉吧? 来来,哥们,看一下下面的例子 @Override protected void onCreate(Bundle savedInsta ...
- Android子线程更新UI的方法总结
版权声明:本文为博主原创文章,转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?postid=6121280 消息机制,对于Android开发者来说,应该是非常 ...
- android子线程更新UI
参考:https://www.cnblogs.com/joy99/p/6121280.html 子线程是不能直接更新UI的.Android实现View更新有两组方法,分别是invalidate和pos ...
随机推荐
- .net混淆、反编译工具调查
常用的工具列表[比较常见的] 混淆器.加密 Dotfuscator VS默认带的工具,不过是个社区版 强度不大 dotNET Reactor 使用了NativeCode 和混淆的形式 Xenocode ...
- ASP.NET MVC验证 - 自定义验证规则、验证2个属性值不等【待验证】
提示:保存后才提示错误信息 自定义验证特性,继承ValidationAttribute并实现IClientValidatable 这次重写了基类的IsValid()方法的另外一个重载,因为该重载包含了 ...
- 阿里云Center OS 6.2 Nginx 配置 SSL/TLS HTTPS配置
1.通过https://www.startssl.com/ 免费SSL证书 STARTSSL 跟VeriSign一样,StartSSL(网址:http://www.startssl.com,公司名:S ...
- redis 学习笔记(4)-HA高可用方案Sentinel配置
上一节中介绍了master-slave模式,在最小配置:master.slave各一个节点的情况下,不管是master还是slave down掉一个,“完整的”读/写功能都将受影响,这在生产环境中显然 ...
- lecture13-BP算法的讨论和置信网
这是HInton课程第13课,这一课有两篇论文可以作为课外读物<Connectionist learning of belief networks>和<The wake-sleep ...
- 【分布式协调器】Paxos的工程实现-cocklebur选举
其实整个项目中一个最主要的看点就是选举算法,而这部分也是逻辑最复杂最难理解的部分.不同的实现在不同的场景下的策略也不尽相同,而且场景非常之多.接下来我们一起来看一下Cocklebur的实现思路. 一个 ...
- .NET基于Redis缓存实现单点登录SSO的解决方案
一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享. 单点登录(Single Sign On),简称 ...
- [云上天气预报-有时有闪电]2月3日23:00-4:00阿里云SLB升级期间网络会闪断
大家好,2月3日23:00-2月4日4:00,阿里云将对SLB(负载均衡)进行升级,在升级期间,SLB会有约4-8次的网络闪断.由此给您带来麻烦,望谅解! 阿里云官方公告内容如下: 尊敬的用户: 您好 ...
- Android热修复实践应用--AndFix
一直关注App的热修复的技术发展,之前做的应用也没用使用到什么热修复开源框架.在App的热修复框架没有流行之前,做的应用上线后发现一个小小的Bug,就要马上发一个新的版本.我亲身经历过一周发两个版本, ...
- Bootstrap系列 -- 4. 文本内容强调
一. 文本强调基本样式 .text-muted:提示,使用浅灰色(#999) .text-primary:主要,使用蓝色(#428bca) .text-success:成功,使用浅绿色(#3c763d ...