본문 바로가기

개발도구/aOS - 안드로이드 개발

[안드로이드] Android에서 ProgressDialog창 띄우기

Android에서 ProgressDialog창 띄우기

* 방법

1. Thread 사용

2. Handler 사용

3. AsyncTask 사용

 

 

 

1. Thread 사용

 

 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  progressBar = new ProgressDialog(this);
  progressBar.setTitle("Test");
  progressBar.setMessage("progressing...");
  progressBar.setCancelable(false);
  progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  progressBar.show();

 

  Thread thread = new Thread(new Runnable() {
   private   int i=0;
   public void run() {
    for(  i = 0; i < 10000; i++){ 
     Log.d("Test", "i = "+i);
     if(i %100 == 0){
      runOnUiThread(new Runnable(){
       @Override
       public void run() {
         progressBar.setProgress(i/100);
       }     
      });
     }
    }
    runOnUiThread(new Runnable(){
     @Override
     public void run() {
       progressBar.dismiss();
     }     
    });
   }
  });
  thread.start();

}

 

2. Handler 사용

 

핸들러가 새로운 스레드로 동작하지는 않는다.(When you create a new Handler, it is bound to the thread / message queue of the hread that is creating it.)

그러면, 스레드를 생성한 다음에 그 안에서 핸들러를 만들어야 된다는 말인가?

 


  Thread thread = new Thread(new Runnable() {
   public void run() {
    MyHandler h = new MyHandler();// Handler를  UIThread에서 생성하고, 그곳으로 send해야할 듯.
    h.sendMessage(Message.obtain(null, 100));
   }
  });
  thread.start();

 

그런데 이렇게 하면 아래의 에러가 난다.

handler inside thread that has not called looper.prepare()

일단 얘는 패스.

 

3. AsyncTask 사용

 

new MyAsyncTask().execute("2000", "2500", "3000", "1500", "2000");

 

private class MyAsyncTask extends AsyncTask<String, Integer, Long>{

  @Override
  protected void onCancelled() {
   // TODO Auto-generated method stub
   super.onCancelled();
  }

  @Override
  protected void onPostExecute(Long result) {
   // doInBackground가 끝난 후 UI Thread를 호출한다.
   progressBar.dismiss();
   Toast.makeText(thiz, "Total spent time is : "+result, Toast.LENGTH_LONG).show();
   super.onPostExecute(result);
  }

  @Override
  protected void onPreExecute() {
   // MyAsyncTask.execute가 호출되자 마자, UI스레드에서 실행 됨
   progressBar.show();
   super.onPreExecute();
  }

  @Override
  protected void onProgressUpdate(Integer... values) {
   // publishProgress의 콜백함수. UI Thread를 호출한다.
   super.onProgressUpdate(values);
   progressBar.setProgress(values[0]);
  }

  @Override
  protected Long doInBackground(String... params) {
   // onPreExecute호출이 끝나고 실행되는 함수
   // 계산 결과는 publishProgress(Progresss...)함수를 통해 실행하기

   long totalTimeSpent = 0;
   int numberOfParams = params.length;

   for(int i = 0; i < numberOfParams; i++){

    SystemClock.sleep(new Integer(params[i]));
    totalTimeSpent += new Long(params[i]);
    publishProgress((int)(((i+1)/(float)numberOfParams)*100));
   }
   return totalTimeSpent;
  }

 }