Android

안드로이드 - Thread (AsyncTask)

로픽 2017. 8. 26. 13:25
300x250

안드로이드 - Thread (AsyncTask)


기존에 Thread는 메인 Thread와 서브 Thread가 데이터를 주고 받기 위해서는 Handler를 사용하였습니다.

하지만 Thread와 Handler를 따로 만들어야하는 불편한 점이 있습니다.

이런 점을 해결하기 위해서 안드로이드 프레임워크는 AsyncTask객체를 만들어 둘을 하나로 묶었습니다.

AsyncTask객체의 사용법은 우선 객체를 상속 받은 이후 콜백메소드를 오버라이딩합니다.


** 콜백메소드 **
onPreExecute() →  doInBackground()메소드가 실행되기 전 준비단계

protected void onPreExecute() {    //Thread에서 실행될 작업을 초기화 및 설정한다.

        Log.i(TAG,"onPreExecute()");


        dialog = new ProgressDialog(mContext);

        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

        dialog.setTitle("Dialog");

        dialog.setMessage("작동 시작");

        dialog.setCancelable(false);

        dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {

            @Override

            public void onClick(DialogInterface dialogInterface, int i) {

                dialog.dismiss();

                cancelFlag = true;

                cancel(true);

            }

        });

        dialog.setProgress(0);

        dialog.show();

    }



doInBackground() → Thread의 run메소드와 같은 역할(publishProgress()메소드를 통해서 ProgressUpadte()에 파라미터 전달)



protected Integer doInBackground(Integer... integers) {

        Log.i(TAG,"doInBackground()");

        Log.i(TAG,"params[0] : " + integers[0]);

        Log.i(TAG,"params[1] : " + integers[1]);


        for(int i = 0; i<integers[0]; i++){

            publishProgress(String.valueOf(i));  //onPoregressUpdate에 전달하는 파라미터

            try{Thread.sleep(200);}catch (Exception e){}

            if(cancelFlag) break;

        }

        return integers[0];

    }





onProgressUpdate() → 작업의 진행정도가 업데이트



protected void onProgressUpdate(String... values) {

        Log.i(TAG,"onProgressUpdate()");


        int i = Integer.parseInt(values[0]);

        dialog.setProgress(i);

        mTv.setText(String.valueOf(i));

    }



onPostExecute() → 작업 완료 후 호출



@Override

    protected void onPostExecute(Integer integer) {

        Log.i(TAG,"onPostExecute()");

        Log.i(TAG, "result : " + integer);


        mTv.setText(String.valueOf(integer));

        dialog.dismiss();

    }



onCancelled() → 작업이 잘못되어 정지되었을 때 호출



5개의 콜백메소드를 오버라이딩하여 사용하여 AsyncTask객체를 구현할 수 있습니다.


위에 콜백메소드를 이용하여 간단한 예제를 만들면~






progressdialog를 만들 수 있습니다. 만약 CANCEL을 누른다면 숫자가 쓰여있는 TextView는 Cancelled란 문자로 변경됩니다.


MainActivity에서 객체를 생성하고 실행하는 부분은 Button뷰에 이벤트를 달았습니다.



protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        tv = (TextView) findViewById(R.id.tv01);

        btn01 = (Button) findViewById(R.id.bt01);

        btn01.setOnClickListener(listener);

    }


    View.OnClickListener listener = new View.OnClickListener() {

        @Override

        public void onClick(View view) {

            switch (view.getId()){

                case R.id.bt01:

                    newAsyncTask = new NewAsyncTask(MainActivity.this, tv);

                    newAsyncTask.execute(100,50);

                    break;

            }

        }

    };


반응형