※ 引述《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 固然方便,但终究是有代价要付的。
当你要显示的文字会频繁累加时,回头使用老方法,未必不是更好的选择。