본문 바로가기

안드로이드

안드로이드 AsyncTask 예제 1

안드로이드는 UI를 담당하는 메인 스레드가 존재한다. (이 스레드는 함부로 접근 못함)

우리가 만든 스레드로는 화면 못 바꾼다.

 

이러한 Background 작업은 AsyncTask 클래스 사용하면 심플해진다.

(UI 작업을 위해 만들어야 했던 Handler가 필요 없어진다.) 오예!!

 

 

 

예시)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 // < > 안에 들어있는 자료형은 순서대로 doInBackground, onProgressUpdate, onPostExecute의 매개변수 자료형이다
    class BackgroundTask extends AsyncTask <Integer, Integer, Integer>{
 
        @Override
        protected Integer doInBackground(Integer ... values) {
            // 주작업 구현
            // Integer ... values 는 values 라는 이름의 Integer 배열
            // isCancelled() => Task가 취소 되었을때를 뜻함
            while (isCancelled() == false) {
                value++;
                // excute(100)의 100을 사용하려면
                // if(value >= values[0].intValue())으로 해도 같은 결과가 나온다.
                if(value >= 100) {
                    break;
                } else {
                    // publishProgress()는 onProgressUpdate()를 호출하는 매소드
                    // 그러므로 UI(여기선 프로그래스 바)가 계속 업데이트 된다
                    publishProgress(value);
                }
                try {
                    // 0.1초 간격으로 멈추면서 위의 value++이 실행되더라. sleep 없이 돌려보니 순삭.
                    Thread.sleep(100);
                } catch (InterruptedException e) {
 
                }
            }
            return value;
        }
 
        @Override
        protected void onPreExecute() {
            // 초기화 단계에서 사용하기 때문에 초기화 관련 코드 작성
            value = 0;
            progressBar.setProgress(value);
        }
 
        @Override
        protected void onPostExecute(Integer o) {
            // 이 Task에서 수행되던 작업이 종료되었을 때 호출됨.
            progressBar.setProgress(0);
            textView.setText("완료되었습니다.");
        }
 
        @Override
        protected void onProgressUpdate(Integer ... values) {
            // 중간중간 진행사항을 UI에 업데이트
            // publishProgress(value)의 value를 값으로 받는다. values는 배열이라 여러개 받기 가능
            progressBar.setProgress(values[0].intValue());
            textView.setText("현재 진행 값 : " + values[0].toString());
        }
 
        @Override
        protected void onCancelled() {
            progressBar.setProgress(0);
            textView.setText("취소되었습니다.");
        }
    }
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

1) 백그라운드 작업 시작 전 31번 라인 onPreExecute() 메소드 호출.

여기선 준비 작업을 한다.

 

 

2) onPreExecute() 메소드 다음 본격 5번 라인 doInBackground() 동작

doInBackground() 실행 도중 publishProgress()을 호출하면 45번 라인 onProgressUpdate()가 실행된다.

 

 

3) publishProgress()을 호출하면 45번 라인 onProgressUpdate()가 실행된다.

이 메소드는 사용자에게 진행을 알릴때 사용한다.

 

4)38번 라인 onPostExecute() 메소드는 백그라운드 작업이 완료된 후 결과 값을 얻는다.

 

5) onCancelled()는 AsyncTask 객체를 cancel()로 종료시키면 호출되는 메소드이다.

 

 

시작을 누르면 AsyncTask에 의해 0.1초 간격으로 프로그래스 바가 차오른다 ( 진행 값도)

 

 

 

출처, 참고, 도움 : https://itmir.tistory.com/624

 

#34 AsyncTask를 사용해보자

이 강좌부터 예제소스를 이클립스 버전이 아닌, 안드로이드 스튜디오 버전으로 기본 제공합니다. 안드로이드 스튜디오는 gradle과 sdk 의존성등 예제 소스를 import할 경우 많은 오류가 발생할 수 있습니다. gradl..

itmir.tistory.com

https://youngest-programming.tistory.com/11

 

[안드로이드] asynctask 사용법 예제(이해하기쉽게 정리) + 병렬 실행

새로 만든 스레드에서 UI객체에 직접 접근하는것은 불가합니다. 그래서 핸들러를 사용하기도 하지만 핸드러를 사용하면 코드가 좀 복잡해집니다. 이러한 Background 작업을 심플하게 하기 위해서 AsyncTask 클래스..

youngest-programming.tistory.com