Handler
是指Android提供的更新
UI
的一套机制,也是消息处理的机制,同样可以使用
Handler
来发送消息,也可以处理消息。
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/download"
/>
private Handler handler=new Handler(){
public void handleMessage(Message msg) {
switch(what){
case 0:
break;
case 1:
dialog.dismiss();
Bitmap bitmap=(Bitmap) msg.obj;
imageView.setImageBitmap(bitmap);
break;
break;
}
};
};
@Override
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView=(ImageView) findViewById(R.id.imageView);
dialog = new ProgressDialog(this);
dialog.setMessage("正在加载.......");
}
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){
@Override public void run() { imageView.setImageBitmap(bitmap);
dialog.dismiss();
}
});
}
} catch (ClientProtocolException e) { e.printStackTrace(); }
catch (IOException e) { e.printStackTrace();
}
}
}).start();
}
}
但需要注意的是在Android程序中只有在主线程里面可以实现对
UI的更新,所以不使用
Handler是不能够随意更新
UI的,因为Android在设计的时候就封装了一套消息创建,传递,处理的机制,如果不遵循这样的机制就会出现异常或错误,而不能实现对
UI的更新。
除此之外,主线程中是不能执行网络资源请求操作的,并且也不能在主线程以外的线程中更新 UI,所以在 Handler基础上进行封装之后,就可以在子线程中执行一些耗时操作了。
除此之外,主线程中是不能执行网络资源请求操作的,并且也不能在主线程以外的线程中更新 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:text="下载图片"
android:onClick="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;
int what=msg.what;
dialog.show();
default:
protected void onCreate(Bundle savedInstanceState) {
public void downLoad(View v){
final Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);
handler.post(new Runnable() {
以上一共写了五种操作Handler的方式,但是其中第一种操作方式是不推荐的,剩余的方式可以用自己的掌握程度去使用,哪一种用起来顺手,就用哪一种。该段代码主要是利用了Handler和子线程去获得网络资源(图片)并传给Handler对页面中的ImageView 进行更新显示。当然这里没有写获取网络资源的代码,其实就利用HTTPURLConnection获取字节数组的一个简单的包含静态方法
getWebRescouce(String path)
的工具类
HttpUtil
。由于比较简单这里就不写出了。忘见谅