Tag Archives: ProgressDialog

[Java/Android] Thread를 이용한 특정 작업 수행하기

안드로이드에서 비동기로 특정 작업을 처리하기 위해 간편하게 사용할 수 있는 것으로 AsyncTask가 있습니다. 하지만 그것 이전에 어디서든지 사용할 수 있는 Thread를 이용한 방법에 대해 간단히 정리해 보도록 하겠습니다.

여기서 주의할 점은 처리가 끝나는 시점에서 UI를 변경한다거나 하는 것을 핸들러를 이용하여 처리하는 부분인데요 안드로이드에서는 메인 쓰레드 이외에서 UI에 영향을 끼치는 행위를 거부하고 있습니다. 그렇기 때문에 핸들러를 이용하여 처리를 합니다.

[code]public class ThreadDownloadActivity extends Activity implements OnClickListener
{
    private ProgressDialog mPdProgress;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        // 상태 표시용 프로그래스바
        mPdProgress = new ProgressDialog(this);
        mPdProgress.setMessage(“작업을 수행중입니다.”);
        mPdProgress.setIndeterminate(true);
        mPdProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        mPdProgress.setCancelable(false);
       
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
    }
   
  // 이미지 다운로드 결과 표시용 핸들러
    final Handler handler = new Handler()
    {
    public void handleMessage(Message msg)
    {
    mPdProgress.dismiss();
    String message = null;
    switch(msg.what)
    {
case 0:
message = “수행 완료”;
break;

default:
message = “수행 실패”;
break;
}
   
    // 메시지 출력
    Toast.makeText(ThreadDownloadActivity.this, message, Toast.LENGTH_SHORT).show();
    }
    };

@Override
public void onClick(View v)
{
mPdProgress.show();

// 이미지 저장용 쓰레드
   Thread thread = new Thread(new Runnable()
   {
            public void run()
            {
        try
        {
        // 특정 작업을 수행
        // 원래는 이미지 다운로드를 구현해 보려 하였지만 포기;;
        Thread.sleep(2000);
        handler.sendEmptyMessage(0);
        }
        catch(Exception e)
        {
        // 작업이 실패 시
        handler.sendEmptyMessage(1);
        }
            }
        });
        thread.start();
}
}[/code]
위와 같은 코드를 수행해 보면 다음과 같이 잘 동작하는 것을 확인할 수 있습니다.
사용자 삽입 이미지1359710808.zip

[Android] ProgressDialog 재사용시에 멈추는 현상 해결하기

제목에 재사용이라고 썼지만 사실 재사용을 안하는 이야기를 하려고 합니다-_-a 대부분의 책들이 ProgressDialog의 경우 재사용 하는 예제를 싣고 있고 물론 작동을 잘 하고 사용에 아무런 문제가 없습니다.

하지만 여기서 겪는 문제가 있습니다. 스타일을 ProgressDialog.STYLE_SPINNER 쓸때 보면 다이얼로그의 재사용시에 스피너가 회전을 하지 않습니다. 이것 참 난감하더군요.

여기에 대해 다양한 방법론이 제시되곤 합니다. 쓰레드등을 사용하여 비동기로 띄운다거나..하지만 잘 생각해 보면 그냥 재사용 안하면 됩니다; 우리 Dalvik VM의 GC를 믿어보는거죠;

[code]@Override
protected Dialog onCreateDialog(int id)
{
  switch(id)
  {
  case DEFAULT_PROGRESS_BAR:
    dlgProgress = new ProgressDialog(this);
    dlgProgress.setMessage(“Loading…”);
    dlgProgress.setIndeterminate(true);
    dlgProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    dlgProgress.setCancelable(false);
    return dlgProgress;
  }
 
  return super.onCreateDialog(id);
}[/code]
이제 다이얼로그를 띄울때는 다음과 같이 showDialog를 사용하여 띄우면 되겠죠.

[code]showDialog(DEFAULT_PROGRESS_BAR);[/code]
이제 다이얼로그를 닫을때 dismiss를 사용하실텐데 다음과 같이 removeDialog도 해주시기 바랍니다.
[code]dlgProgress.dismiss();
removeDialog(DEFAULT_PROGRESS_BAR);[/code]
이제 평소에 비해 좀 더 좋아보이시나요?