0x0 前言
在上一篇文章中,Android 线程之Thread 中,我们发现单纯使用Thread类,更新UI时,都要创建新的Runable对象,对于资源是一种浪费。在本篇中,我们将Thread与Handler联合起来使用,避免资源浪费。
0x1 概述
A Handler allows you to send and process Message and Runnable objects
associated with a thread’s MessageQueue.
0x3 演示
怎么使用Handler呢,以一个账户登录demo为例子,截取部分代码:
在我们的activity中,Handler类推荐用法
private static class IHandler
extends Handler {
private final WeakReference<Activity> mActivity;
public IHandler(MainActivity activity) {
mActivity = new WeakReference<Activity>(activity);
}
@Override
public void handleMessage(Message msg) {
// super.handleMessage(msg);
if (dialog != null) {
dialog.dismiss();
}
int flag = msg.what;
switch (flag) {
case 0:
String errorMsg = msg.getData().getSerializable("ErrorMsg").toString();
((MainActivity) mActivity.get()).showTips(errorMsg);
break;
case FLAG_LOGIN_SUCCESS:
((MainActivity) mActivity.get()).showTips(MSG_LOGIN_SUCCESS);
break;
default:
break;
}
}
}
private IHandler handler = new IHandler(this);
登录线程
//登陆线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
user.userLogin(MainActivity.this, userName, password);
handler.sendEmptyMessage(FLAG_LOGIN_SUCCESS);
} catch (ConnectException e) {
Message message = new Message();
Bundle data = new Bundle();
data.putSerializable("ErrorMsg", "无法确立连接");
message.setData(data);
handler.sendMessage(message);
} catch (ConnectTimeoutException e) {
Message message = new Message();
Bundle data = new Bundle();
data.putSerializable("ErrorMsg", "连接超时");
message.setData(data);
handler.sendMessage(message);
} catch (SocketTimeoutException e) {
Message message = new Message();
Bundle data = new Bundle();
data.putSerializable("ErrorMsg", "SocketTimeoutException连接超时");
message.setData(data);
handler.sendMessage(message);
} catch (ServiceRulesException e) {
Message message = new Message();
Bundle data = new Bundle();
data.putSerializable("ErrorMsg", e.getMessage());
message.setData(data);
handler.sendMessage(message);
} catch (Exception e) {
e.printStackTrace();
Message message = new Message();
Bundle data = new Bundle();
data.putSerializable("ErrorMsg", MSG_LOGIN_ERROR);
message.setData(data);
handler.sendMessage(message);
}
}
});
thread.start();