Handler 機(jī)制 實(shí)現(xiàn)了跨線程間消息傳遞
耗時(shí)操作在新建線程中進(jìn)行,結(jié)果返回到主線程(UI線程)
**更新 UI **的操作,只能在 主線程中進(jìn)行
關(guān)鍵 API
Handler :
一個(gè) 線程 最多只有一個(gè) Handler ;
handleMessages() 主線程中該方法被 回調(diào),處理接收到的消息 Message
sendMessage() 新開啟的線程中調(diào)用該方法向主線程發(fā)消息(Message)
Looper:
循環(huán)調(diào)度
MessageQueue:
存儲(chǔ)消息
創(chuàng)建了 Looper 后,自動(dòng)創(chuàng)建 MessageQueue
Message:
線程間交互 的消息
Message.what 消息的識(shí)別名稱
Message.obj 消息的具體內(nèi)容(如,string)
線程創(chuàng)建方式
-
創(chuàng)建 Thread 的子類,并實(shí)現(xiàn) run() 方法
public MyThread extends Thread{ public void run( ){ xxxxx; } } -
創(chuàng)建實(shí)現(xiàn)了 Runnable接口 的子類,并實(shí)現(xiàn) run( ) 方法
public MyThread implements Runnable{ public void run( ){ xxxxx; } } -
創(chuàng)建一個(gè) Thread 線程,并 匿名實(shí)現(xiàn)了 Runnable 接口 (Android 開發(fā)中常用)
Thread myThread = new Thread(new Runnable() { @Override public void run() { xxxxx; } } myThread.start( );
跨線程消息傳遞 Demo
// 主函數(shù)
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();
// 實(shí)現(xiàn)新線程的函數(shù)
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();
}