본문 바로가기
App/Android Java

Android_Java(31) - AsyncTask

by SeleniumBindingProtein 2022. 2. 15.
728x90
반응형

1.Async 클래스 사용
        - AsynTask 클래스
            - 작업 스레드와 관련된 복잡한 부분을 쉽게 처리해주는 클래스 
            - onPreExecute() : UI 스레드에서 실행되며, 작업을 설정하는데 사용됨 
            - doInBackground() : 작업 스레드에서 수행할 작업을 기술하는 곳임 
            - onProgressUpdate() : UI 스레드에서 호출되고, 작업 진행률 업데이트에 사용됨 
            - onPostExecute() : 작업 완료되면 UI에 결과를 업데이트하는데 사용됨 

            - AsyncTask<Params, Progress, Result>
                - Params : 실행 시에 작업에 전달되는 값의 타입임
                - Progress : 작업 진행 정도를 나타내는 값의 타입 
                - Result : 작업 결과 값을 나타내는 값의 타입 


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

    <ProgressBar
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/progress_bar"
        style="?android:attr/progressBarStyleHorizontal">
    </ProgressBar>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button"
        android:text="카운터 작업 시작">
    </Button>


</LinearLayout>

package kr.co.asynctask;

import androidx.appcompat.app.AppCompatActivity;
import androidx.loader.content.AsyncTaskLoader;

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 {
    private ProgressBar mProgress;
    private int mProgressStatus = 0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setIcon(R.drawable.ic_launcher);

        mProgress = findViewById(R.id.progress_bar);
        Button button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                new CounterTask().execute(0);
            }
        });
    }

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

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        //매개변수에 ...와 같이 마침표 3개 붙임 => 가변 매개 변수
        //백그라운드에서 실행됨
        @Override
        protected Integer doInBackground(Integer... integers) {
            while(mProgressStatus < 100){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                mProgressStatus++;
                publishProgress(mProgressStatus);
            }
            return null;
        }

        //프로그레스 바를 업데이트함
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            mProgress.setProgress(mProgressStatus);
        }

        @Override
        protected void onPostExecute(Integer integer) {
            super.onPostExecute(integer);
            mProgress.setProgress(mProgressStatus);
        }
    }
}

[결과 출력]

01

728x90
반응형

'App > Android Java' 카테고리의 다른 글

Android_Java(33) - MusicService  (0) 2022.02.23
Android_Java(32) - ImageDownload  (0) 2022.02.15
Android_Java(30) - ThreadBasic(2)  (0) 2022.02.15
Android_Java(29) - ThreadBasic  (1) 2022.02.15
Android_Java(28) - AudioPlay  (0) 2022.02.15

댓글