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

时间:2011-09-22 11:47:35

标签: android multithreading textview android-edittext

我正在实现一个简单的聊天应用程序,其中包含用于文本消息的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,对吧? 那么我该怎么做才能克服这个限制呢? 有人能给我一些启示吗?提前谢谢。

1 个答案:

答案 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上完成的工作量。