2014年6月26日 星期四

Thread要更新畫面,除了使用Handler以外,還可以考慮BroadCastReceiver.......(內無程式碼,因為不需要)

有人注意到BroadCastReceiver也可以像Handler一般接受從主線程以外發出的「更新畫面」指令嗎?

註冊一個特定畫面專用的BroadCastReceiver,(或是你有別的辦法可以產生動態、適用所有你想要的畫面的Receiver,)然後改成使用sendBroadcast(Intent intent),來接收........

public abstract void onReceive (Context context, Intent intent)

在Receiver內的這個函式中的Context就可以獲得發出這個Intent的Activity。

也就是說,用Context(強制形變一下)來執行....findViewById(int id)

就可以輕鬆的更新任何想要更新的畫面了........

效率是不太好啦!(但也不會很糟。)



為何要想出這招,而不是滿足於使用Handler就好?因為用Handler更新畫面,在測試程式中看起來很完美,但實務上經常碰到的問題是:

變化比較頻繁的功能可能會發生「Handler」送出後,但是Activity卻已經關閉。

這時候APP絕對死當!




一般來說,大家都會把Handler寫成個別Activity下的子類別、巢狀類別,所以裡面的Activity都很「專一」,但也因為專一,所以大家可以寫個很獨特的偵測方式來決定Handler真的被主執行緒執行後,要不要真的執行畫面更新的動作......

多麻煩啊!(把Activity變成Handler的參數,然後每呼叫到一次就先執行、檢查一下「act != null」.......這樣的設計合理嗎?見人見智。)

改用BroadCastReceiver,只要解除註冊,就不用再煩惱任何問題,如果有問題就是「寫錯內容」,而不是「發送Handler的程序需要調整」。

而且在Android下,只要確認View元件的ID碼正確、內容也正確,其實BroadCastReceiver可以作的事情、可以更新的畫面幾乎是無限多。



(稱這為「小秘訣」...好像有點沒價值。到網路上找,好像沒什麼人想到這樣做。)

沒有留言:

張貼留言