마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

UI쓰레드의 궁금점입니다.

0 추천

갑자기 가물가물한데요..

메인쓰레드가 아닌 다른 별도의 쓰레드에서 UI조작에 간섭하면 ANR이 발생하는걸로 알고 있습니다.

그래서 UI에 관련된 작업을 하려면 handler.post(new Runnable... 로 감싸주고 해야하는걸로 기억하는데요.

아래의 코드를 보시져.

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.button1);
progress = new ProgressDialog(this);
progress.setTitle("");
progress.setMessage("로딩중...");
progress.show();
 
Thread testThread = new Thread(testRunnable);
testThread.start();
 
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
 
}
});
}
 
private Runnable testRunnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0; i<10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
progress.dismiss();
}
};
 
코드를 보시면 프로그래쓰바를 show하는건 메인쓰레드에서 해서 문제가 없죠.
그런데 보시면 testRunnable은 메인쓰레드가 아닌 UI조작을 해서는 안되는 메인쓰레드와는 다른 별도의 쓰레드인데
progress.dissmiss(); 가 먹힙니다.
ANR이 걸리지 않구요.
좀 혼란스럽네요.
속시원히 말씀 좀 부탁드립니다.
갸아악 (21,260 포인트) 님이 2013년 11월 28일 질문

1개의 답변

+1 추천
 
채택된 답변
Dialog 클래스의 dismiss 메소드는 아무스레드에서나 호출해도 괜찮다고 공식 문서에 설명되어 있습니다.

http://developer.android.com/reference/android/app/Dialog.html#dismiss%28%29

아마도 dismiss를 호출할 때 바로 다이얼로그를 닫는게 아니라 메인 스레드에 작업을 위임하는 식으로 구현되어 있을 겁니다.
익명사용자 님이 2013년 11월 28일 답변
갸아악님이 2013년 12월 5일 채택됨
...