오늘이라도
[Android] 28. AsyncTask 본문
반응형
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
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
반응형
'취업성공패키지 SW 개발자 교육 > Android' 카테고리의 다른 글
[Android] 29. 안드로이드 & DB & 서버(스프링) 연동 ① : 회원가입, 로그인 구현 (0) | 2020.06.17 |
---|---|
[Do it! 안드로이드] 03. 첫 번째 앱 만들기 / 03-1. 첫 프로젝트 만들기 (0) | 2020.06.16 |
[Do it! 안드로이드] I. Hello! 안드로이드 / 01. 안드로이드란? / 01-1. 안드로이드 이해하기 / 01-2. 안드로이드의 흐름 살펴보기 (0) | 2020.06.15 |
[Android] 27. 진동 울리기, 소리 울리기, 짧은 음악 파일 재생 / 알림 띄우기 (0) | 2020.06.15 |
[Android] 26. 구글 지도 연동, 현재 위치 표시, 장소 검색, 특정 위치에 마커 추가 / 와이파이, 데이터 연결 확인 (4) | 2020.06.12 |