반응형

 

main 스레드와 새로만든 스레드 사이를 혼용해서 스레드를 사용하고자 할때 (UI 에 어떤 정보를 넘겨서 보여주고 싶을때 유용하다)

 

 

package com.jjjjj.myasynctask;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;

public class MainActivity extends AppCompatActivity {

    ProgressBar progressBar;

    int value;


    BackGroundTask task = new BackGroundTask();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressBar = findViewById(R.id.progressBar);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                task.execute();     //BackGroundTask-AsyncTask 를 실행시킨다
            }
        });

        Button cancel = findViewById(R.id.button2);
        cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                task.cancel(true);
            }
        });

    }

    class BackGroundTask extends AsyncTask<Integer, Integer, Integer>{

        //onPreExecute, onPostExecute, onProgressUpdate 전과 후에 UI 업데이트를 하고 싶을 때 사용 할 수 있다
        @Override
        protected void onPreExecute() {     //스레드 실행 전
            //super.onPreExecute();
            value = 0;
            progressBar.setProgress(value);

        }

        @Override
        protected void onPostExecute(Integer integer) { //스레드 실행 후(스레드 종료 후)
            //super.onPostExecute(integer);
            progressBar.setProgress(0);
        }

        @Override
        protected void onProgressUpdate(Integer... values) { // update, publishProgress(value); 이걸 통해서 이쪽으로 넘어온다
            //super.onProgressUpdate(values);
            progressBar.setProgress(values[0].intValue());
        }

        @Override
        protected Integer doInBackground(Integer... integers) { //스레드로 동작 하는 부분
            //return null;
            while(isCancelled() == false)
            {
                value += 1;

                if(value >= 100)
                {
                    break;
                }

                //onProgressUpdate 를 호출한다
                publishProgress(value);

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

                }
            }

            return value;       //onPostExecute 가 호출되게 된다
        }
    }

}

 

기본 화면

 

 

 

실행 버튼 누르면 progress bar 가 증가한다

 

취소 누르면 더이상 progress 바가 증가 하지 않는다

 

 

반응형

+ Recent posts