Re: [問題] 單向綁定不斷新增資料導致app卡頓

作者: pinefruit (莫使惹塵埃)   2021-05-28 17:37:49
※ 引述《Dong0129 (阿東)》之銘言:
: 各位版友好,
: 最近在開發一支工具要對設備周邊的host進行傳輸,並將收到的結果印在設備上,
: 一開始在xml裡將TextView單向綁定到ObservableField<String> message,要增加印出的
: 訊息處理如下,
: message.set(message.get()+newMessage);
: 從傳輸到增加資料到message過程都寫在另一個Thread處理,
: 但執行次數一多,會看到log訊息提示在main thread做太多事情,且app開始卡頓,
: 後來直接透過Handler,透過binding.layoutId.TextViewId找到目標TextView並用append
: 函式將訊息印出,不會有先前卡頓的問題...
: 請問為什麼會有這樣的差別呢?如果要用原先message.set(message.get()+newMessage);
: 的方式,該怎麼處理才可以避免app卡頓呢?
在 TextView 的原始碼中,剛進入 append() 函式時會先執行下面幾行:
1. if (!(mText instanceof Editable)) {
2. setText(mText, BufferType.EDITABLE);
3. }
也就是說,在呼叫 append() 時,若 mText 並非 Editable 的實體,
則會先利用上面的第 2 行,將其轉換為 Editable 衍生類別的實體。
當 mText 被轉換後,它將不再是不可變(immutable)的字串物件。
若你持續爬原始碼,會發現 TextView 的佈局實作也會跟著做調整,
藉此來因應可能經常修改的文字內容。
透過上述觀察,應該多少可以理解到,
為何 append() 和 data binding 在你的例子中會有效能上的差異。
至於你遇到的卡頓問題該怎麼處理,
是我的話,會直接放棄對此文字訊息使用 data binding,
改用 TextView 的 append() 就好。
data binding 固然方便,但終究是有代價要付的。
當你要顯示的文字會頻繁累加時,回頭使用老方法,未必不是更好的選擇。

Links booklink

Contact Us: admin [ a t ] ucptt.com