handler:消息处理者
用 handlerMessage()处理
handle.sendMessage() 发送消息

为什么使用:

  1. 在连接网络,获取网络信息中,发生异常会导致ANR异常(应用程序无响应),所以最好将获取网络信息的步骤放到子线程中,而不是UI线程(主线程)中。
  2. 改变UI状态(设置,改变等等组件)又必须放到主线程中处理,所以需要handler来在主线程和子线程中传递消息

如何使用:

  1. 在主线程中(也就是类似MainActivity的类中,新建handler对象,重写handler的handler的handleMessage()方法)
  2. 在业务代码中创见子线程,用handler.sendMessage()发送消息给主线程中的方法,达到获取信息,更新UI的目的

** 例子:点击事件中,新建线程,用线程来发送图片**

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public void onClick(View v) {
final String url = mUrl.getText().toString(); //要在内部类中使用url,必须加上final修饰符
if (!TextUtils.isEmpty(url)){
new Thread(new Runnable() {
@Override
public void run() {
Bitmap bitmap = getImageFromNet(url); //得到网络获取到的图片
if (bitmap != null){
Message msg = new Message();
msg.what = SUCCESS; //消息的类型,用以区分其他消息
msg.obj = bitmap; //需要发送的对象,赋值给obj对象
handler.sendMessage(msg); //用handler给祝方法发送消息对象
}else{
Message msg =new Message(); //如果为错误,不发送消息对象
msg.what = ERROR;
handler.sendMessage(msg);
}
}
}).start();

}else {
Toast.makeText(this,"请输入内容",Toast.LENGTH_SHORT).show();
}

}

在主线程中,重写hanleMessage()方法,得到消息类型来写业务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private android.os.Handler handler = new android.os.Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case SUCCESS:
mImage.setImageBitmap((Bitmap) msg.obj); //强转为我们需要的Bitmap类型
break;
case ERROR:
Toast.makeText(MainActivity.this,"获取失败",Toast.LENGTH_SHORT).show();
break;
}
}
};