我正在实现一个简单的聊天应用程序,其中包含用于文本消息的TextView和用于输入的EditText。 我通过以下方法更新我的TextView:
private void addChatContent(String authorName, String content){
final String newLine = authorName+" : "+content+"\n";
chat_content.append(newLine);
scroll.post(new Runnable(){
@Override
public void run() {
scroll.smoothScrollTo(0, chat_content.getBottom()+5000);
}
});
}
我遇到的一个问题是:当有新的传入消息时,UI线程将忙于刷新TextView。它使我的EditText变得滞后,我几乎无法编辑我的输入。 我无法用另一个线程刷新TextView,对吧? 那么我该怎么做才能克服这个限制呢? 有人能给我一些启示吗?提前谢谢。
答案 0 :(得分:2)
最终,不幸的是,只有一个专用于UI的线程。如果您要更新TextView,则无法同时使用EditText获得无滞后体验。你已经知道了这一点,但我担心有些人回答这个问题可能不会,所以here's a reference:
系统不会为每个a实例创建单独的线程 零件。在同一进程中运行的所有组件都是 在UI线程中实例化,并对每个组件进行系统调用 从该线程发送。因此,回应的方法 系统回调(例如onKeyDown()报告用户操作或a 生命周期回调方法)总是在进程的UI线程中运行
...
当您的应用执行密集型工作以响应用户互动时, 除非你这样,否则这个单线程模型会产生很差 正确实施您的申请。具体来说,如果一切都是 发生在UI线程中,执行网络等长时间操作 访问或数据库查询将阻止整个UI。当线程是 阻止,不能调度任何事件,包括绘制事件。
...
此外,Andoid UI工具包不是线程安全的。所以,你必须 不要从工作线程操纵你的UI - 你必须做所有 从UI线程操作到您的用户界面。因此,那里 只是Android单线程模型的两个规则:
不要阻止UI线程 不要从UI线程外部访问Android UI工具包
因此,答案很明确:不要这样做。为什么Textview必须绝对,100%是最新的,因为用户正在更新EditText字段?你为什么一直滚到底部;也许你可以删除TextView的大部分内容,当用户滚动时,动态地重新添加内容?
IMO你应该专注于减少你需要在TextView上完成的工作量。