天天看點

論__AlertDialog自定義布局回調修改的正确方式論__AlertDialog自定義布局回調修改的正确方式

本文由 luzhuo 編寫,請尊重個人勞動成果,轉發請保留該資訊.

原文: <code>http://blog.csdn.net/rozol/article/details/50441057</code>

微網誌: <code>http://weibo.com/u/2524456400</code>

這幾天寫了個應用,自定義了<code>alertdialog</code>布局,加入了<code>textview</code>和進度條展示,但是不管怎麼調,<code>dialog</code>就是不顯示出來,即時顯示出來也不更新,隻在程式執行完了才更新. 于是沒轍了,換成android自帶的<code>progressdialog</code>試試,結果還是老樣子.(也是要麼不顯示,即時顯示了也不更新,隻在程式執行完了才更新.) 于是親自動手寫個demo看看到底是什麼問題.(反複折騰,終于折騰出結果來了,先下結論吧.) 這篇文章沒有插圖,下面有github的連結,下載下傳裡面的apk就能很清楚的知道這篇文章在講什麼啦!!!
一定要在輔助線程裡執行的回調才能修改dialog的界面; (第1,2的案例) 在ui線程裡執行的回調不能修改dialog的界面.(準确的說:能修改,但是不是你想要的效果) (第3,4的案例)
先看<code>mainactivity</code>裡的代碼:

從上訴代碼可以看出,我是讓 子線程/異步任務/ui線程 裡執行的任務通過回調方式. 然後在回調裡發送<code>message</code>的方式更新ui. 由于 子線程/異步任務 都不能修改ui,是以使用發送<code>message</code>的方法,但是ui線程是可以直接修改<code>dialog</code>裡的布局的,是以我會增加一個通過回調直接修改<code>dialog</code>的案例.</blockquote>

第一種,通過開啟子線程方式,然後回調修改dialog的界面. 由于子線程不能修改ui界面,是以使用handler方式.
子線程通過執行回調,回調裡發送<code>message</code>修改dialog的界面. 執行的結果是可行的,完全可以修改<code>dialog</code>的顯示.效果非常好.
第二種,通過異步任務方式,然後回調修改dialog的界面. 由于輔助線程不能修改ui界面,是以使用handler方式.
異步任務通過執行回調,回調裡發送<code>message</code>修改dialog的界面.
第三種,通過ui線程方式,然後回調修改dialog的界面. 由于為了與上面的例子做個參照物,是以還是使用handler方式.
ui線程通過執行回調,回調裡發送<code>message</code>修改dialog的界面. 執行的結果是糟糕的,log在程式執行完後才列印,而且是一起快速列印,而且根本沒看到<code>dialog</code>的顯示.
第四種,通過ui線程方式,然後回調修改dialog的界面. 由于為了與第三個例子做個參照物,是以直接回調然後修改dialog的方式. 由于還是執行第三個例子的<code>dialogthread</code>類的方法,代碼這裡不再粘貼. 這裡粘貼<code>mainactivity</code>裡的部分主要代碼.
ui線程通過執行回調,回調裡直接修改dialog的界面. 執行的結果是糟糕的,log能完美的列印,但是根本沒看到<code>dialog</code>的顯示.
q:如何知道目前線程是否是ui線程? a:log.i(“uithread”, “目前線程”.concat(thread.currentthread().getid() == 1 ? “是” : “不是”).concat(“ui線程”));

繼續閱讀