오늘이라도

[Android] 28. AsyncTask 본문

취업성공패키지 SW 개발자 교육/Android

[Android] 28. AsyncTask

upcake_ 2020. 6. 16. 09:56
반응형

https://github.com/upcake/Class_Examples

교육 중에 작성한 예제들은 깃허브에 올려두고 있습니다. 

gif 파일은 클릭해서 보는 것이 정확합니다.


 - AsyncTask -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="72dp"
        android:max="100" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="실행"
        android:textSize="24sp" />

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="취소"
        android:textSize="24sp" />
</LinearLayout>

▲activity_main.xml

 

package com.example.my42_asynctask;
//Async : asynchronous 동시에 존재하지 않는, 비동기식의

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {
    //객체 선언
    BackgroundTask backgroundTask;
    int value;

    ProgressBar progressBar;
    Button button1, button2;

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

        //객체 초기화
        progressBar = findViewById(R.id.progressBar);
        button1 = findViewById(R.id.button1);
        button2 = findViewById(R.id.button2);

        //실행 버튼
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                backgroundTask = new BackgroundTask(progressBar, value); //backgroundTask 객체 초기화
                backgroundTask.execute(); // backgroundTask 실행
            }
        });

        //취소 버튼
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                backgroundTask.cancel(true);
            }
        });
    }
}

▲MainActivity.java

 

 

▲BackgroundTask 클래스 생성

 

package com.example.my42_asynctask;

import android.os.AsyncTask;
import android.util.Log;
import android.widget.ProgressBar;

public class BackgroundTask extends AsyncTask<Void, Integer, String> {
    //Void → doInBackground
    //Integer → onProgressUpdate
    //String → onPostExcute

    /*
    ① 생성자 만들기
    ② onPreExecute() : 넘겨받은 객체들에 초기화가 필요할때 사용
    ③ doInBackGround  : 대부분의 기능들은 여기다 작성
    ④ onProgressUpdate : 필요하면 씀, 안쓰면 매개 변수의 Integer를 Void로 바꿔준다
    ⑤ onPostExecute() : String도 필요하면 쓰고 안쓰면 String을 Void로 바꿔준다

     */
    private static final String TAG = "BackgroundTask";
    
    ProgressBar progressBar;
    int value;

    public BackgroundTask(ProgressBar progressBar, int value) {
        this.progressBar = progressBar;
        this.value = value;
    }

    //onPreExecute → doInBackground → onProgressUpdate(값이 필요하다면 작동) → onPostExecute
    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        value = 0;
        progressBar.setProgress(value);
    }

    //doInBackground에서 리턴한 값은 onPostExecute로 간다. (리턴 타입과 onPostExecute의 매개변수의 타입이 같아야함)
    @Override
    protected String doInBackground(Void ... voids) {
        while (isCancelled() == false) {
            value++;
            if(value >= 100) {
                break;
            } else {
                publishProgress(value);
                //publishProgress(value, value + 1, value + 2);
            }

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

        return "100% 완료!";
    }

    @Override
    protected void onProgressUpdate(Integer ... values) {
        super.onProgressUpdate(values);

        progressBar.setProgress(values[0].intValue());
        //Log.d(TAG, "onProgressUpdate: " + values[1].toString());
        //Log.d(TAG, "onProgressUpdate: " + values[2].toString());
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        Log.d(TAG, "onPostExecute: " + result);

        progressBar.setProgress(0);
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
        Log.d(TAG, "onCancelled: 실행 취소됨!");

        progressBar.setProgress(0);
    }
}

 

▲BackgroundTask.java

반응형