Handler 机制 实现了跨线程间消息传递
耗时操作在新建线程中进行,结果返回到主线程(UI线程)
**更新 UI **的操作,只能在 主线程中进行
关键 API
Handler :
一个 线程 最多只有一个 Handler ;
handleMessages() 主线程中该方法被 回调,处理接收到的消息 Message
sendMessage() 新开启的线程中调用该方法向主线程发消息(Message)
Looper:
循环调度
MessageQueue:
存储消息
创建了 Looper 后,自动创建 MessageQueue
Message:
线程间交互 的消息
Message.what 消息的识别名称
Message.obj 消息的具体内容(如,string)
线程创建方式
-
创建 Thread 的子类,并实现 run() 方法
public MyThread extends Thread{ public void run( ){ xxxxx; } }
-
创建实现了 Runnable接口 的子类,并实现 run( ) 方法
public MyThread implements Runnable{ public void run( ){ xxxxx; } }
-
创建一个 Thread 线程,并 匿名实现了 Runnable 接口 (Android 开发中常用)
Thread myThread = new Thread(new Runnable() { @Override public void run() { xxxxx; } } myThread.start( );
跨线程消息传递 Demo
// 主函数
static final int RESPONSE = 1;
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case RESPONSE:
textView.setText(String.valueOf(msg.obj));
break;
default:
break;
}
};
};
sendHTTPRequest();
// 实现新线程的函数
private void sendHTTPRequest() {
new Thread(new Runnable() {
@Override
public void run() {
URL url;
HttpURLConnection httpURLConnection = null;
StringBuilder result = new StringBuilder();
try {
url = new URL("http://www.baidu.com");
// 获取 HTTPURLConnection 对象
httpURLConnection = (HttpURLConnection) url
.openConnection();
httpURLConnection.setRequestMethod("GET");
// 获取 HTTP连接的 Response
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(httpURLConnection
.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null) {
result.append(line);
}
Message message = new Message();
message.what = RESPONSE;
message.obj = result.toString();
handler.sendMessage(message);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 断开 HTTP连接
if (httpURLConnection != null) {
httpURLConnection.disconnect();
}
}
}
}).start();
}