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

AsyncTask와 ProgressDialog 사용 시 다이얼로그가 나타나지 않는 현상

0 추천
public class OK_Genuine extends Activity implements OnClickListener {
 ImageView ok, cancel;
 
 String QRcode;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  
  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.result_page);
  
  setLayout();

  QRcode = getIntent().getExtras().getString("QRcode");
  
 }

 private void setLayout() {
  ok = (ImageView) findViewById(R.id.result_ok);
  cancel = (ImageView) findViewById(R.id.result_cencel);

  ok.setOnClickListener(this);
  cancel.setOnClickListener(this);
 }

 @Override
 public void onClick(View v) {
  find_your_current_location();
 }
 
 public void find_your_current_location(){
  WaitForLocationUpdate updateThread = new WaitForLocationUpdate(this);
  updateThread.execute();

  while(!updateThread.isCancelled()){}
  
  Intent intent = new Intent(OK_Genuine.this, Not_Geo.class);
  startActivity(intent);
  // 현재 액티비티를 종료
  OK_Genuine.this.finish();
 }
 
 public class WaitForLocationUpdate extends AsyncTask<Void, Integer, Integer> {
  ProgressDialog progressDialog;
  Context mContext;
  
  public WaitForLocationUpdate(Context context) {
   mContext = context;
  }
  
  @Override
  protected void onPreExecute() {
   progressDialog = new ProgressDialog(mContext);
   progressDialog.setMessage("업데이트...");
   progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
   progressDialog.setCancelable(false);
   progressDialog.setMax(5);
   progressDialog.show();

   super.onPreExecute();
  }
  
  @Override
  protected Integer doInBackground(Void... param)
  {
   int i = 0;
   try{
    for(i = 0; i < 5; i++){
     Thread.sleep(1000);
     publishProgress(i + 1);
    }
    
   } catch(Exception e){ }

   cancel(true);
   return i;
  }

  @Override
  protected void onPostExecute(Integer result)
  {
   Toast toast = Toast.makeText(mContext, Integer.toString(result), Toast.LENGTH_LONG);
   toast.show();
   progressDialog.dismiss();
   
   super.onPostExecute(result);
  }

  @Override
  protected void onProgressUpdate(Integer... values) {
   progressDialog.setProgress(values[0]);
  }
 }
}

 

액티비티에서 버튼을 눌렀을 때

AsyncTask를 만들고 ProgressDialog로 작업 중 진행상황을 보여주려고 합니다.

만들긴 했는데

지금 문제가 시작되는 시점에서 다이얼로그가 출력되지 않고

작업이 끝나는 시점에서 진행이 완료된 다이얼로그만 잠깐 나왔다가 사라집니다.

문제점이 뭔지 찾을 수가 없네요.

경험있으신 분의 힌트를 부탁드리겠습니다.

 

클라이버 (150 포인트) 님이 2013년 12월 18일 질문

1개의 답변

0 추천
 
채택된 답변
while문으로 무한루프도는 작업들은 쓰레드같은데서 작업하는게 좋지 않을까요.

onClick에서 루프를 계속돌아서 UI갱신이 안되고 계속 UI쓰레드를 잡고있는것같은데요.

 

onClick안에 while문에서 하는작업을 onPostExecute에서 해줘야하는게 맞을것같네요.

onCancelled메소드도 오버라이딩해서 같은작업을 해주시고요.
얼룩돼지 (15,720 포인트) 님이 2013년 12월 18일 답변
클라이버님이 2013년 12월 19일 채택됨
알듯 모를듯 하더니 답변을 보니 원인이 파악이 되네요.
고맙습니다. 덕분에 해결했습니다. ^^
...