Handler
是結(jié)合線程的消息隊列來發(fā)送漩蟆、處理 Message
對象和 Runnable
對象的一種工具额衙。它在創(chuàng)建時就與一個線程相關(guān)聯(lián),所有發(fā)送給它的消息都會在這個線程中處理。它本質(zhì)上是一種工具谭企,用來簡化消息隊列和消息循環(huán)的使用倔毙,也就是隱藏 Looper
與 MessageQueue
的實現(xiàn)細節(jié)埃仪。
腦圖 Handler
最后附上一個預(yù)防內(nèi)部 Handler
內(nèi)存泄漏的工具類,幾年前寫的陕赃,代碼已上線多年可直接使用卵蛉。
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.annotation.NonNull;
import java.lang.ref.WeakReference;
public abstract class WeakReferenceHandler<T> extends Handler {
private WeakReference<T> ref;
public WeakReferenceHandler(T t) {
super();
ref = new WeakReference<>(t);
}
public WeakReferenceHandler(Callback callback, T t) {
super(callback);
ref = new WeakReference<>(t);
}
public WeakReferenceHandler(Looper looper, T t) {
super(looper);
ref = new WeakReference<>(t);
}
public WeakReferenceHandler(Looper looper, Callback callback, T t) {
super(looper, callback);
ref = new WeakReference<>(t);
}
protected T get() {
return ref.get();
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
T t = get();
if (t != null) {
onHandleMessage(msg, t);
}
}
public abstract void onHandleMessage(Message msg, @NonNull T t);
}
說是預(yù)防,其實就是使用 WeakReference
時比較方便么库,使用的時候還是要記住應(yīng)該用靜態(tài)內(nèi)部類來繼承傻丝,否則就沒有意義了。
用法
- 創(chuàng)建一個static內(nèi)部類诉儒,繼承
WeakReferenceHandler
并將泛型參數(shù)設(shè)置為這個Activity
的類型葡缰。 - 創(chuàng)建構(gòu)造函數(shù),接收
Activity
對象并調(diào)用super(T)
方法(直接用編譯器的錯誤提醒創(chuàng)建就行)忱反。 - 實現(xiàn)抽象方法
onHandleMessage()
泛释,在這里處理消息,這個函數(shù)保證傳遞來的Activity
對象是非空的(也可以用錯誤提示直接創(chuàng)建)温算。
示例:
private static class CloseHandler extends WeakReferenceHandler<AdActivity> {
CloseHandler(AdActivity activity) {
super(activity);
}
@Override
public void onHandleMessage(Message msg, @NonNull AdActivity a) {
switch (msg.what) {
case MESSAGE_CLOSE_MANUAL:
a.closeManually();
break;
case MESSAGE_CLOSE_AUTO:
a.closeAutomatically();
break;
case MESSAGE_COUNT_DOWN:
a.countDown();
break;
}
}
}