您的位置:首页 > 产品设计 > UI/UE

Android之UI更新--Handler

2015-10-12 21:07 579 查看
 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。由于比较简单这里就不写出了。忘见谅
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  技术 android ui