Android之UI更新--Handler

  Handler 是指Android提供的更新 UI 的一套机制,也是消息处理的机制,同样可以使用 Handler 来发送消息,也可以处理消息。
但需要注意的是在Android程序中只有在主线程里面可以实现对 UI的更新,所以不使用 Handler是不能够随意更新 UI的,因为Android在设计的时候就封装了一套消息创建,传递,处理的机制,如果不遵循这样的机制就会出现异常或错误,而不能实现对 UI的更新。
除此之外,主线程中是不能执行网络资源请求操作的,并且也不能在主线程以外的线程中更新 UI,所以在 Handler基础上进行封装之后,就可以在子线程中执行一些耗时操作了。
下面来,说一下基本的原理:当开启子线程执行耗时操作后,等到拿到数据后就封装到 Message对象中,然后将Message对戏那个放进 MessageQueue(队列)中,然后在需要数据的代码段就可以利用 Looper来从 MessageQueue中获取 Message对象,通过 Message对象中标记的Target判断要发送给哪一个 Handler对象进行数据处理, Handler拿到 Message对象后既可以获得数据,并对相应的 UI进行更新。
接下来就利用一个简单的例子来说明一下:
main.xml文件中的基本代码如下:
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"  >
 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content" 
android:text="下载图片" 
android:onClick="downLoad" 
 /> 
 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:layout_below="@+id/download" 
 /> 

主类当中的代码如下:
private ImageView imageView; 
//private String path =    "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superplus/img/logo_white_ee663702.png"; //private String path = "http://img05.tooopen.com/images/20150930/tooopen_sy_144091333294.jpg"; 
private String path=
"http://img05.tooopen.com/images/20151007/tooopen_sy_144669522547.jpg"; 
private ProgressDialog dialog; 
  private Handler handler=new Handler(){ 
 public void handleMessage(Message msg) { 
int what=msg.what; 
 switch(what){
 case 0:
dialog.show(); 
  break; 
 case 1: 
 dialog.dismiss(); 
  Bitmap bitmap=(Bitmap) msg.obj;
 imageView.setImageBitmap(bitmap);
  break; 
default:
       break; 
 
 }; 
 }; 
 @Override 
protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
 imageView=(ImageView) findViewById(R.id.imageView); 
 dialog = new ProgressDialog(this); 
 dialog.setMessage("正在加载.......");
 }

public void downLoad(View v){ 
 Message message=new Message(); 
 message.what=0;
 handler.sendMessage(message); 
 new Thread(new Runnable() { 
 @Override public void run() {
 try { 
 byte[] data=HttpUtil.getWebRescouce(path); 
 if(data!=null && data.length>0){
final Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);
  

  

   

 

handler.post(new Runnable() { 
 @Override public void run() { imageView.setImageBitmap(bitmap);
 dialog.dismiss(); 
 
 }); 
 
 } catch (ClientProtocolException e) { e.printStackTrace(); }
 catch (IOException e) { e.printStackTrace(); 
 
  } 
 }).start(); 
 
 }
以上一共写了五种操作Handler的方式,但是其中第一种操作方式是不推荐的,剩余的方式可以用自己的掌握程度去使用,哪一种用起来顺手,就用哪一种。该段代码主要是利用了Handler和子线程去获得网络资源(图片)并传给Handler对页面中的ImageView 进行更新显示。当然这里没有写获取网络资源的代码,其实就利用HTTPURLConnection获取字节数组的一个简单的包含静态方法 getWebRescouce(String path) 的工具类 HttpUtil 。由于比较简单这里就不写出了。忘见谅
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值