上例中,你可能注意到在工作線程中訪問了主線程handler對象,并在調用handler的對象向消息隊列加入了一個消息。這個過程中會不會出現消息隊列數據不一致問題呢?答案是handler對象不會出問題,因為handler對象管理的Looper對象是線程安全的,不管是加入消息到消息隊列和從隊列讀出消息都是有同步對象保護的,具體請參考Looper.java文件。上例中沒有修改handler對象,所以handler對象不可能會出現數據不一致的問題。
通過上面的分析,我們可以得出如下結論:
1、如果通過工作線程刷新界面,推薦使用handler對象來實現。
2、注意工作線程和主線程之間的競爭關系。推薦handler對象在主線程中構造完成(并且啟動工作線程之后不要再修改之,否則會出現數據不一致),然后在工作線程中可以放心的調用發送消息SendMessage等接口。
3、除了2所述的hanlder對象之外的任何主線程的成員變量如果在工作線程中調用,仔細考慮線程同步問題。如果有必要需要加入同步對象保護該變量。
4、handler對象的handleMessage接口將會在主線程中調用。在這個函數可以放心的調用主線程中任何變量和函數,進而完成更新UI的任務。
5、Android很多API也利用Handler這種線程特性,作為一種回調函數的變種,來通知調用者。這樣Android框架就可以在其線程中將消息發送到調用者的線程消息隊列之中,不用擔心線程同步的問題。
深入理解Android消息處理機制對于應用程序開發非常重要,也可以讓你對線程同步有更加深刻的認識。以上是最近Simon學習Android消息處理機制的一點兒總結,如有錯誤之處請不吝指教。