상세 컨텐츠

본문 제목

[안드로이드]ProgressBar(상태바) 반복 AsyncTask 만들어보기

안드로이드

by aries574 2020. 12. 14. 09:39

본문


2020/12/12 - [안드로이드] - [안드로이드]스위치(Switch) On, Off 만들어 보기


이번 시간에는 상태바를 이용해서 자동으로 상태가 변하는 반복앱을 만들어보겠습니다.

데이터를 반복하기 위해서는 백그라운드(Background)상태에서 작업을 하는데, 

백그라운드 상태에서 화면에 데이터를 적용을 할 수 없다는 문제가 생깁니다.

이 문제를 해결할 수 있는게 바로 AsyncTask 입니다.

AsyncTask를 이용해서 반복작업 시작, 정지 하는 기능을 하는걸 만들겠습니다.


1. 화면구현(activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">

<TextView
android:id="@+id/persentValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/progressBar"
android:layout_centerHorizontal="true"
android:text="0%"
android:textSize="30sp" />

<ProgressBar
android:id="@+id/progressBar"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_above="@+id/startBtn"
android:layout_centerHorizontal="true" />

<Button
android:id="@+id/startBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="100dp"
android:text="시작" />

<Button
android:id="@+id/stopBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="200dp"
android:text="정지"

/>

</RelativeLayout>


2. 기능구현(MainActivity.java)

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;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

ProgressBar progressBar;
TextView persent;

Button startBtn;
Button stopBtn;

int value = 0;

BackgroundTask task;

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

progressBar = findViewById(R.id.progressBar); //상태바
persent = findViewById(R.id.persentValue);//텍스트뷰

startBtn = findViewById(R.id.startBtn);//시작버튼
stopBtn = findViewById(R.id.stopBtn);//정지버튼

startBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

task = new BackgroundTask();
task.execute(); //반복시작
}
});

stopBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
task.cancel(true); // onCancelled() 호출
}
});
}


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

@Override
protected Integer doInBackground(Integer... integers) {


while(isCancelled() == false){

value += 10;
if(value >= 100){
break;
}else{
publishProgress(value); //onProgressUpdate 호출
}
try{
Thread.sleep(1000); // 1

}catch (InterruptedException ex){
ex.printStackTrace();
}
}

return value;
}

@Override
protected void onProgressUpdate(Integer... values) {
progressBar.setProgress(values[0]);
persent.setText(values[0] + "%");

}

@Override
protected void onPostExecute(Integer values) {

progressBar.setProgress(0);
persent.setText("");
value = 0; //초기화

}

@Override
protected void onCancelled() {
super.onCancelled();
progressBar.setProgress(0);
}
}
}

3. 실행화면


반응형

관련글 더보기

댓글 영역