有人注意到BroadCastReceiver也可以像Handler一般接受從主線程以外發出的「更新畫面」指令嗎?
註冊一個特定畫面專用的BroadCastReceiver,(或是你有別的辦法可以產生動態、適用所有你想要的畫面的Receiver,)然後改成使用sendBroadcast(Intent intent),來接收........
也就是說,用Context(強制形變一下)來執行....findViewById(int id)
就可以輕鬆的更新任何想要更新的畫面了........
效率是不太好啦!(但也不會很糟。)
為何要想出這招,而不是滿足於使用Handler就好?因為用Handler更新畫面,在測試程式中看起來很完美,但實務上經常碰到的問題是:
變化比較頻繁的功能可能會發生「Handler」送出後,但是Activity卻已經關閉。
這時候APP絕對死當!
一般來說,大家都會把Handler寫成個別Activity下的子類別、巢狀類別,所以裡面的Activity都很「專一」,但也因為專一,所以大家可以寫個很獨特的偵測方式來決定Handler真的被主執行緒執行後,要不要真的執行畫面更新的動作......
多麻煩啊!(把Activity變成Handler的參數,然後每呼叫到一次就先執行、檢查一下「act != null」.......這樣的設計合理嗎?見人見智。)
改用BroadCastReceiver,只要解除註冊,就不用再煩惱任何問題,如果有問題就是「寫錯內容」,而不是「發送Handler的程序需要調整」。
而且在Android下,只要確認View元件的ID碼正確、內容也正確,其實BroadCastReceiver可以作的事情、可以更新的畫面幾乎是無限多。
(稱這為「小秘訣」...好像有點沒價值。到網路上找,好像沒什麼人想到這樣做。)
註冊一個特定畫面專用的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可以作的事情、可以更新的畫面幾乎是無限多。
(稱這為「小秘訣」...好像有點沒價值。到網路上找,好像沒什麼人想到這樣做。)
沒有留言:
張貼留言