AsyncTask

1.5버전부터 추가된 AsyncTask는 개발자가 사용자 인터페이스에 대한 비동기적인 작업을 하게 해준다.

UI스레드에서 AsyncTask의 execute를 호출하면 되는데 이 AsyncTask를 물론 구현해주어야한다.

 

아래는 AsyncTask를 사용한 현재 시간 타이머


public class MainActivity extends AppCompatActivity {

    private TextView time;
    private int count=0;
    private SimpleDateFormat format=new SimpleDateFormat("yyyy년 MM월 dd일 a hh:mm:ss");
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        time=(TextView)findViewById(R.id.time);

        new AsyncCounterTask().execute();
    }

    class AsyncCounterTask extends AsyncTask<Void, Void, Integer> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.e("__LOG__","onPreExecute");
        }
        @Override
        protected Integer doInBackground(Void... integers) {
            while(count<100){
                try {
                    Thread.sleep(1000);
                }catch(InterruptedException e){}
                //publishProgress 호출 후 바로 onProgressUpdate가 호출됨
                publishProgress();
            }
            Log.e("__LOG__","doInBackground End");
            return count;
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
            Log.e("__LOG__","onProgressUpdate");
            long now = System.currentTimeMillis();
            time.setText(format.format(new Date(now)));
        }

        @Override
        protected void onPostExecute(Integer integer) {
            super.onPostExecute(integer);
            Log.e("__LOG__","onPostExecute");
        }
    }
}

 

AsyncTask<Params, Progress, Result>처럼 Generic을 사용한다.

 

Params : 실행 시 작업에 전달되는 값

Progress : 작업의 진행정도를 나타내는 값

Result : 작업의 결과를 나타내는 값

 

모두 사용할 필요는 없고 필요에 따라 사용하면 된다.

 

AsyncTask는 어떤 식으로 동작하게 될까? 다음은 몇안되는 AsyncTask의 메소드들인데 그냥 알아두면 편하다.

 

실행 순서는 onPreExecute -> doInBackground -> [ publishProgress -> onProgressUpdate ] ... -> onPostExecute

(위의 엑티비티를 실행하고 로그를 보면 알 수 있다. 아 참고로 접두사 pre는 ~전에, post는 ~ 후에 라는 점을 알면 기억하기 쉽겠다)

 

onPreExecute와 onPostExecute는 doInBackground 실행전, 실행후 한번씩만 실행이 된다. 그래서 doInBackground에서 반환하는 값이 onPostExecute에 전달이 된다. 

publishProgress를 호출하면 onProgressUpdate가 실행이 되는데 여기서 UI를 업데이트할 수 있다. 

 

여기서 중요한것은 doInBackground는 무조건 Override해야한다. (필자는 doInBackground가 쓰레드의 run과 같은 메소드와 비슷하다고 생각, 물론 자세히 까보면 다르겠지만....)

 

아는 사람은 알겠지만 SimpleDateFormat을 사용하여 날짜와 시간에 대한 format을 지정하고 System.currentMillis()를 이용하여 시스템의 현재 시간을 밀리초 단위(정확히 말하면 1970년 1월 1일부터 지금까지 흐른 밀리초)로 구하여 Date의 인자로 집어넣는다. 

이것을 format 형식으로 출력하려면 SimpleDateFormat의 format 메소드의 인자로 쏙 넣으면 되쥬.

 

그렇게 어려운 소스코드는 아니므로 이해가 될 거라 본다.

 

 

반응형
블로그 이미지

REAKWON

와나진짜

,