本文由PurpleSword(jzj1993)原創,轉載請注明
原文網址 http://blog.csdn.net/jzj1993
安卓主線程(UI線程)是線程不安全的:對UI控件的操作都應在主線程中完成;UI線程不應執行耗時操作,以免程序不響應(即ANR異常)
實現新線程的常用方法(注意要調用start方法啟動新線程而不是run方法):
一、定義類,實現Runnable接口
class MyRunnable
implements Runnable {
/**
* 實現接口的run方法
*/
@Override
public void run() {
// run方法的中程序體將在新線程中執行
}
}
new Thread(
new MyRunnable()).start();
二、簡潔寫法
new Thread(
new Runnable() {
@Override
public void run() {
// 新線程操作
}
}).start();
三、定義類,繼承Thread(不推薦):
class MyThread
extends Thread {
/**
* 覆寫run方法
*/
@Override
public void run() {
// 新線程操作
}
}
new MyThread().start();
Thread和Runnable關系
public class Thread
extends Object
implements Runnable
{
}
創建UI線程/主線程的Handler
一、(推薦寫法,用於不處理消息,只是接收Runnable的情況下)
//
無參數實例化時,會創建當前正在運行線程(即主線程)的Handler
Handler handler =
new Handler();
如果handler需要處理消息,按照以下寫法將會產生警告This
Handler class should be static or leaks might occur。此時可使用方法二)
Handler handler =
new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
}
}
};
二、(缺點在於需要定義一個新的類,寫起來比較麻煩)
// 無參數實例化時,會創建當前正在運行線程(即主線程)的Handler
private Handler handler =
new MyHandler() {
// 處理其他線程發送的消息
@Override
public void handleMessage(Message msg) {
Log.d("msg", "msg what = " + msg.what);
switch (msg.what) {
}
}
};
protected static class MyHandler
extends Handler {
}
三、(推薦寫法,可用於接收Runnable和處理消息的情況下)
boolean handleMessage(Message msg) {
switch (msg.what) {
}
return true;
}
private final Handler mainHandler =
new Handler(Looper.
getMainLooper(),
new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
return ActivityMain.
this.handleMessage(msg);
}
});
在UI線程中執行程序
handler.post(
new Runnable(){
@Override
public void run() {
// 操作UI控件等...
}
});
創建新線程的Handler
private HandlerThread handlerThread;
private Handler handler;
this.handlerThread =
new HandlerThread(getClass().getSimpleName());
this.handlerThread.start();
this.handler =
new Handler(
this.handlerThread.getLooper(),
new Handler.Callback() {
public boolean handleMessage(Message msg) {
return NewThread.
this.handleMessage(msg);
}
});
/**
* 處理消息
*
*
@param msg
*
@return
*/
private boolean handleMessage(Message msg) {
switch (msg.what) {
}
return true;
}
通過Message進行線程間通信:在任意線程中向其他線程Handler發送消息
/**
* 向線程Handler發送消息
*
*
@param id
*
@param o
*/
protected void sendMsg(
int id, Object o) {
if (handler !=
null) {
Message msg = Message.obtain();
msg.obj = o;
msg.what = id;
handler.sendMessage(msg);
}
}
/**
* 向線程Handler發送消息
*
*
@param what
*/
protected void sendMsg(
int what) {
if (handler !=
null) {
handler.sendEmptyMessage(what);
}
}
handler.sendMessageDelayed(msg, milliseconds);
Message.obtain(handler,
what, obj).sendToTarget();