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

看板AndroidDev作者 (莫使惹塵埃)時間3年前 (2021/05/28 17:37), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《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 固然方便,但終究是有代價要付的。 當你要顯示的文字會頻繁累加時,回頭使用老方法,未必不是更好的選擇。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.218.168.129 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1622194671.A.2A4.html
文章代碼(AID): #1WiBdlAa (AndroidDev)
文章代碼(AID): #1WiBdlAa (AndroidDev)