1주일 전에 이 문제로 질문을 올리고..그 이후로..계속 연구해 봤지만,
UI 를 업데이트 못시키고 있습니다.
public static NextPlace()
{
RadioButton.settext(......);
... 대충 이렇게... 몇개의 버튼과 텍스트뷰에 글자를 써 넣습니다.... 디비에서 읽어 와서요..
그리고...
화면에 다 뿌려지고 나면....즉 화면이 새로운 정보로 업뎃 되고 나서....
CallMyTTS();
}
public static CallMyTTS()
{
TTS 실행하는 코드..................
}
위에서.. 화면 업뎃 내용이...너무 늦어서..
이미 CallMyTTS() 가 실행되어 버립니다.
CallMyTTS() 는 변경된 내용에 대한 것들인데...
화면에 아직 이전 정보들이 있는데.. TTS 가 새로운걸 읽어줘야 하는데..예전꺼를 보고 있는 상태에서...
새로운 걸..읽어주는 코믹한 상황이 벌어지고 있습니다.
refreshDrawablestate, invaliate 별별 메서드 다 써봤는데요... 화면 업뎃이 안되네요...흐.....헐...
구글링과 여기 답변을 이용해서...
public static NextPlace()
{
RadioButton.settext(......);
.............화면 변경 작업 등등....
handler.post( new Runnable() {
public void run() {
화면 업뎃~~~
}
} )
CallMyTTS();
}
이렇게 하고.. 화면 업뎃 자리에.. 변경 있었던 콘트롤에 invalidate, requestLayout 등등 실행해 봤지만.소용이 없네요.
콘트롤의 업뎃이 끝나면 이 콘트롤들의 내용이 화면에 바로 반영되어야 하는데... 쉽지 않네요.
어떻게 해야 좋을지 조언 부탁드려요~
이상하네요. 먼저 디비 열고 제대로 db, cursor를 close 시켜 줬는지 여부를 확인하시고 로그를 찍어서 어디에서 지연이 되고 먼저 실행 되는지 확인을 해보세요. 코드상에 문제가 커보이네요. 스레드를 별개로 돌리는 상황이 아니라면 순차적으로 수행되야 합니다 그리고 ddms 에서 오류가 나고 있는데 stacktrace 시키고 있지는 않는지 확인해 보시길 바랍니다
첫시간 부터 UI 업뎃은 쓰레드하면 안된다구....말씀하시네요...
윈도우즈 같으면. 큐에 있는 메시지를 다 처리하게 할텐데....
자바에서는 UI 업뎃을 위한 처리를 빨리 마무리 시키는 방법이 어려운건가 봐요...
이리 힘들줄이야...헐...
자답입니다.
생각을 반대로 했습니다. UI 는 그대로 놔두고... CallMyTTS() 를 쓰레드에 넣었습니다.
다음과 같이요.
public static NextPlace()
{
............ 디비에서 몇개 레코드 읽어옴...
RadioButton.settext(......);
.............읽어온 텍스트로 화면 상의 콘트롤 색상 텍스트 등등 변경 작업 등등....
// CallMyTTS();
(new ThreadTTS()).start();
}
class ThreadTTS extends Thread {
public void run() {
CallMyTTS();
}
}
4~5일 동안 헤맸는데....생각의 전환으로 겨우 완성했네요...
그동안 댓글 주신 분들 감사합니다!!
원인은 UI Thread에 UI Thread를 사용하는 handler에 어떠한 메시지를 보내도
현재의 event loop이 끝나야 다음게 실행된다는 거죠.
본문에 있는
public static NextPlace()
{
RadioButton.settext(......);
.............화면 변경 작업 등등....
handler.post( new Runnable() {
public void run() {
화면 업뎃~~~
}
} )
CallMyTTS();
}
를 가지고 설명하면 NextPlace()가 완전히 끝날때까지 handler.post()에 넣어둔 건 실행을 하지 않는다는 겁니다.
Runnable을 큐잉만 하는거지 실행은 다음 loop에서 fetch한 이후에 되는거죠.
그때는 이미 CallMyTTS()가 실행된 이후지요.
자바의 문제라기 보다는 Android 프레임워크가 그렇게 생겨먹은겁니다.
저도 글쓴분과 같은 방법으로 해결을 했습니다. ㅋ