2011-09-22 5 views
3

텍스트 메시지 용 TextView와 입력 용 EditText가있는 간단한 채팅 응용 프로그램을 구현하고 있습니다. 나는 다음과 같은 방법으로 내 텍스트 뷰를 업데이트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 스레드가 텍스트 뷰를 새로 고침 바쁜 될 것입니다. 내 EditText가 지연되어 입력 내용을 편집하기 어렵습니다. TextView를 다른 스레드로 새로 고칠 수 없습니다. 그래서이 제한을 극복하기 위해해야합니까? 누군가 내게 빛을 줄 수 있습니까? 미리 감사드립니다.

+0

실제 휴대 전화 또는 에뮬레이터에서 지연됩니까? – sealz

+0

editext에 대한 텍스트 감시자를 만들고 텍스트 감시자에서 텍스트를 변경 한 후에 텍스트 뷰를 업데이트하십시오. –

+0

더 명확한 안내를 위해'addChatContent'를 호출하는 핸들러 코드를 게시하십시오. –

답변

2

궁극적으로, 불행히도 UI 전용 스레드는 하나뿐입니다. TextView를 업데이트하는 경우 EditText를 사용하여 동시에 지연 시간을 가질 수 없습니다. 당신은 이미 알고 있지만, 나는 그렇게 here's a reference,하지 않을 수 있습니다이 질문에 대답 어떤 사람들을 두려워 :

시스템은 구성 요소의 각 인스턴스에 대해 별도의 스레드를 생성하지 않습니다. 동일한 프로세스에서 실행되는 모든 구성 요소는 이며 UI 스레드에서 인스턴스화되며 각 구성 요소에 대한 시스템 호출은 해당 스레드에서 입니다. 따라서, (예를 onKeyDown에() 사용자의 행동을보고하거나 라이프 사이클 콜백 메소드 등) 시스템 콜백에 응답 방법은 항상 ... 과정

의 UI 스레드에서

앱 수행을 실행 이 단일 스레드 모델은 사용자가 응용 프로그램을 올바르게 구현하지 않으면 성능이 저하 될 수 있습니다. 특히 UI 스레드에서 모든 것이 일 경우 네트워크 과 같은 긴 작업을 수행하거나 데이터베이스 쿼리가 전체 UI를 차단합니다. 스레드가 으로 차단되면 그리기 이벤트를 포함하여 이벤트를 전달할 수 없습니다.

...

또한 Andoid UI 툴킷 스레드 안전하지 않는다. 따라서 작업자 스레드에서 UI를 조작하지 않아야합니다. UI 스레드에서 사용자 인터페이스로 조작을 모두 수행해야합니다. 따라서,이 안드로이드의 단일 스레드 모델에 두 가지 규칙 단순히 :

따라서 UI 스레드 외부에서 안드로이드 UI 툴킷에 액세스하지 마십시오 UI 스레드 를 막지 마십시오

가, 대답은 아주 분명하다 :하지 마. 사용자가 EditText 필드를 업데이트 할 때 Textview가 절대적으로 100 % 최신 상태 여야하는 이유는 무엇입니까? 왜 맨 아래로 스크롤하고 있습니까? 어쩌면 TextView의 대부분의 내용을 삭제할 수 있으며 사용자가 스크롤 할 때 동적으로 내용을 다시 추가 할 수 있습니까?

IMO 당신은 TextView에서해야 할 작업량을 줄이는 데 주력해야합니다.

+0

제안 해 주셔서 감사합니다. D EditText를 편집하고 있는지 여부를 묻는 메시지가 표시 될 수 있습니까? 귀하가 말한대로 콘텐츠를 다시 추가하는 방법도 있습니다. 나에 대한 힌트 또는 정보가 있습니까? 많은 감사합니다. –

+0

RE : EditText 변경 사항을 수신 대기 중입니다. EditText에서 addTextChangedListener()를 사용하여 리스너 객체를 추가하고 객체 유형은 대개 TextWatcher입니다. 이 두 가지 용어에 대해 Google을 사용하거나 새로운 질문을하십시오. 솔직히 말해서 다른 사람들이 더 나은 대답을 할 수 있도록 해 본 적이 없습니다. 일반적으로 성능 측면에서 Log.d() 호출을 사용하여 모든 것을 기록하고 의심 할 여지없이 실제로 지연을 일으키는 것이 무엇인지 파악한 다음 지연의 가장 큰 원인을 찾아야합니다. 행운을 빕니다! –

+0

대단히 감사합니다! –

관련 문제