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的更新,所以不使用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。由于比较简单这里就不写出了。忘见谅
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories