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();