解決某些系統UI使用handler偶爾不顯示問題

    當我們使用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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章