Android 如何在UI中同时编辑EditText和TextView

Android 如何在UI中同时编辑EditText和TextView,android,multithreading,textview,android-edittext,Android,Multithreading,Textview,Android Edittext,我正在实现一个简单的聊天应用程序,它有一个文本视图用于文本消息,一个EditText用于输入。 我通过以下方法更新我的文本视图: private void addChatContent(String authorName, String content){ final String newLine = authorName+" : "+content+"\n"; chat_content.append(newLine); scroll.post(new Runna

我正在实现一个简单的聊天应用程序,它有一个文本视图用于文本消息,一个EditText用于输入。 我通过以下方法更新我的文本视图:

    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。它使我的编辑文本变得滞后,我几乎无法编辑我的输入。 我不能用其他线程刷新TextView,对吗? 那么,我应该做些什么来克服这个限制呢?
谁能给我点光吗?提前感谢。

最后,不幸的是,只有一个线程专用于UI。如果您正在更新TextView,则无法同时获得EditText的无延迟体验。你已经知道这一点,但我担心一些回答这个问题的人可能不知道,因此:

系统不会为的每个实例创建单独的线程 组成部分。在同一进程中运行的所有组件都是 在UI线程中实例化,对每个组件的系统调用 从该线程发送。因此,响应 系统回调(如onKeyDown()以报告用户操作或 生命周期回调方法)始终在进程的UI线程中运行

当您的应用程序响应用户交互执行密集工作时, 这种单线程模型可能会产生较差的性能,除非 正确实现应用程序。具体来说,如果一切顺利 发生在UI线程中,执行长时间操作,如网络 access或数据库查询将阻止整个UI。当线程 如果已阻止,则无法调度任何事件,包括图形事件

此外,andoidui工具包不是线程安全的。所以,你必须 不要从工作线程操作UI,您必须完成所有操作 从UI线程对用户界面进行操作。因此, Android的单线程模型有两条规则:

不要阻塞UI线程 不要从UI线程外部访问Android UI工具包

因此,答案很清楚:不要这样做。为什么当用户更新EditText字段时,Textview必须是绝对的、100%最新的?为什么你要一直滚动到底部;也许你可以删除TextView的大部分内容,当用户滚动时,动态地向其中重新添加内容


在我看来,你应该专注于减少在TextView上需要做的工作。

在真实手机或模拟器上滞后?为EditText创建一个文本观察程序,并在文本观察程序中更改文本后更新你的TextView方法。发布调用
addChatContent
的处理程序代码,以获得更清晰的指导。谢谢大家!我正在emulator上运行,并在BroadcastReceive中调用addChatContent方法感谢您的建议:D我可以问一下如何检测用户是否正在编辑EditText吗?还有如何像你说的那样重新添加内容。也许给我一些提示或信息?非常感谢。RE:收听编辑文本更改。您希望在EditText上使用addTextChangedListener()添加侦听器对象,对象类型通常为TextWatcher。谷歌为这两个词,或提出一个新的问题;老实说,我从来没有这样做过,所以其他人可能会有更好的答案。一般来说,在性能方面,我的建议是使用log.d()调用记录所有内容,毫无疑问,找出导致延迟的真正原因,然后找出导致延迟的最大原因。祝你好运