안드로이드 개발 질문/답변
(글 수 45,052)
ProgressDialog dialog=new ProgressDialog(this);
dialog.show();
try{
Thread.sleep(2000);
}catch(Exception e){}
dialog.dismiss();
다음과 같이 하면 다이얼로그가 2초정도 있다가 사라질 줄 알았는데
아예 보이질 않네요...
메인스레드의 작업이 2초동안 침묵해서(작업)해서 다이얼로그를 안보여 주는건가요..?
2012.10.10 00:53:06
UI 쓰레드(메인쓰레드) 에서 Rendering 이 되야 화면에 보여질텐데
님이 하신 작업은 UI 쓰레드를 멈춰버리게 하니 당연히 안보이지요.
즉 프로그램 전체 화면 그리는게 멈춰 있는겁니다.
로직 작업은 따로 Thread 를 만들어서 처리하시거나, AsyncTask 인가, 그런걸 이용하셔서 처리하시고
처리가 끝났을 때 UI 쓰레드로 이벤트를 보내서 dismiss 되도록 처리하셔야 합니다.
2012.10.10 02:43:36
아 현재 제가 이런걸 원하고 있어서요 ㅜㅜ
public String getjsonResult(string url){
쓰레드 시작;( thread.start();)
String result = 쓰레드에서 받아온 값 가져오기;(async일 경운 get()함수사용 - 메인block됨)
(이부분이 메인스레드에서 대기해야 네트워크 스레드에서 원하는 값을 가져올 수 있지 않나요?
가져오는 동안은 progress띄우려고 하면 메인스레드가 block 되서 안보이고... 방법이 안서네요 ㅜㅜ)
*결과값을 가져와야 다음 작업코드가 제대로 작동되어 대기하고 싶습니다*
return result;
}
2012.10.10 12:49:34
AsyncTask의 가장 일반적인 사용 예가 ACool님과 같은 케이스입니다.
AsyncTask의 onPreExecute(), onPostExecute()는 메인 스레드(정확이 말하면 execute()를 호출한 스레드)에서 실행되는 것이 보장됩니다. 그러니 UI를 건드려도 되겠죠. 다음 코드를 참고하세요
new AsyncTask<Void, Void, String>() {
private ProgressDialog mProgressDlg;
public void onPreExecute() {
mProgressDlg = new ProgressDialog("작업중..."...);
}
public void doInBackground(Void... params) {
// 백그라운드 작업
return result;
}
public void onPostExecute(String result)
{
mProgressDlg.dismiss();
// 이 시점에서 result보고 성공실패에 따른 처리를 해 주면 됩니다.
}
}.execute();
주의할 것은 execute()는 바로 리턴된다는 것입니다.
2012.10.10 05:52:24
아! 그리고
dialog.show();
try{
Thread.sleep(2000);
}catch(Exception e){}
dialog.dismiss();
이게 작동 안된다고 하셨었는데 isShowing찍어보면 계속 true로 찍혀서 나오더라구요..
혹시 z-ordering(depth)로 뒤에 가려진게 아닌가요...?