2011-09-22 42 views
3

我正在實現一個簡單的聊天應用程序,該應用程序具有用於文本消息的TextView和用於輸入的EditText。 我用下面的方法更新我的TextView:如何在UI中同時編輯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

滯後於真實的手機或模擬器? – sealz

+0

爲editext創建文本觀察器,並在文本觀察器中的文本更改方法後更新您的textview。 –

+0

發佈調用addChatContent的處理程序代碼以獲得更清晰的指導。 –

回答

2

最終,不幸的是,只有一個線程專用於UI。如果您正在更新TextView,則無法同時使用EditText獲得無滯後的體驗。你已經知道這一點,但我擔心有些人回答這個問題可能沒有,所以here's a reference

系統不針對 組件的每個實例創建一個單獨的線程。在同一進程中運行的所有組件都是在UI線程中實例化的 ,並且對每個組件的系統調用是從該線程分派的 。因此,該到 系統回調(如的onkeydown()報告用戶操作或 生命週期回調方法)應對方法總是在這個過程中

的UI線程中運行...

當你的應用程序執行爲了響應用戶的交互,這個單線程模型可能會產生較差的性能,除非您的 正確地實現您的應用程序。具體而言,如果在UI線程中發生的所有事情都是 ,則執行長時間操作(如網絡 訪問或數據庫查詢)將阻止整個UI。當線程爲 被阻止時,不能分派任何事件,包括繪圖事件。

...

此外,Andoid UI工具包不是線程安全的。因此,您必須不要從工作線程操縱您的用戶界面 - 您必須從UI線程對您的用戶界面進行所有 操作。因此,有 只是兩個規則Android的單線程模型:

不要阻塞UI線程 不要從UI線程

因此外部訪問Android的UI工具包,答案是很清楚的:不要這樣做。爲什麼Textview必須是絕對的,100%是最新的,因爲用戶正在更新EditText字段?你爲什麼一直滾動到底部;也許你可以避免刪除TextView的大部分內容,並且當用戶滾動時,動態地向它重新添加內容?

IMO你應該專注於減少你在TextView上需要做的工作量。

+0

感謝您的建議:D 請問如何檢測用戶是否正在編輯EditText? 也如何重新添加內容,如你所說。 也許對我有些提示或信息?非常感謝。 –

+0

RE:偵聽EditText更改。您想在EditText上使用addTextChangedListener()添加偵聽器對象,而對象類型通常是TextWatcher。谷歌的這兩個條款,或者提出一個新的問題;說實話我從來沒有這樣做過,所以別人可能會有更好的答案。一般來說,當涉及到性能時,我的建議是使用Log.d()調用記錄所有內容,並確定究竟是什麼導致了延遲,然後追究延遲的最大原因。祝你好運! –

+0

非常感謝! –