當我們使用handler進行UI的異步顯示的時候,在某些手機上,當進行大量UI操作時候,由於UI大量信息在隊列中,可能導致UI刷新不及時,從而導致一些異常。
比如我們想要在異步線程中顯示一個dialog,常規做法可能是直接使用如下方法。
new Handler(content.getMainLooper()).post(new Runnable() {
@Override
public void run() {
dialogHelper.showDialogWithYesNo("用戶提示").show();
}
});
或者直接使用handler搭配Message來進行顯示。
這兩種方法,都有可能導致,handler或者message還沒有準備好,就開始執行接下來的方法,從而導致顯示沒有顯示,造成一些異常。
所以想出瞭如下一種方法,等待UI初始化的完成,防止UI顯示太慢。
方法
首先定義一個全局變量handler,然後在要顯示UI的類中定義一個線程,該線程專門用來實例化該handler。
// 成員變量 handler
private Handler handler = null;
// 實例化handler的子線程
private ThreadUIShow threadUIShow = new ThreadUIShow();
// 線程中進行handler的實例化
class ThreadUIShow extends Thread {
@Override
public void run() {
Looper.prepare();
handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case MSG_SHOW_DIALOG: {
// show UI or do something
}
break;
}
return true;
}
});
Looper.loop();
}
}
最後在需要調用UI的地方進行如下操作。
if (handler == null) {
if (!threadUIShow.isAlive()) {
threadUIShow.start();
}
}
while (handler == null) {
SystemClock.sleep(10);
}
Message message = handler.obtainMessage();
message.what = MSG_SHOW_DIALOG;
message.sendToTarget();