AnsyncTask 비동기 작업


이 섹션 소개:

이 섹션에서는 비동기 작업을 처리하기 위해 Android에서 제공하는 경량 클래스인 AsyncTask를 소개합니다. AsyncTask를 상속받아 클래스에서 비동기 작업을 구현한 다음 UI 메인 스레드에 비동기 실행 진행 상황을 피드백합니다~ 자, 아직 몇몇 개념을 이해하지 못하실 수도 있겠지만, 아직은 멀티스레딩의 개념을 설명할 필요가 있을 것 같으니 먼저 몇 가지 개념적인 부분부터 설명드리겠습니다!


1. 관련 개념

1) 멀티스레딩이란 무엇입니까?

답변: 먼저 애플리케이션, 프로세스, 스레드, 멀티스레딩이라는 이름을 이해해야 합니다! !

  • Application: 특정 작업을 완료하기 위해 특정 언어로 작성된 명령 집합(정적 코드 집합)
  • 프로세스(Process):실행 프로그램, 시스템 스케줄링 독립적인 자원 할당 단위, 운영 체제는 각 프로세스를 할당합니다. 메모리 공간의 한 부분에서 프로그램이 순차적으로 실행되고 관리자 코드가 로드됩니다. -> 실행됩니다. -> 전체 실행 프로세스가 완료됩니다.
  • Thread: 프로세스보다 작은 실행 단위입니다. 각 프로세스에는 여러 스레드가 있을 수 있습니다. 스레드를 실행하려면 하나의 프로세스에 배치해야 합니다. 스레드는 프로그램에 의해 관리됩니다! ! ! 프로세스는 시스템에 의해 예약됩니다! ! !
  • 멀티스레딩: 여러 명령을 병렬로 실행하고 스케줄링 알고리즘에 따라 CPU의 타임 슬라이스를 각 스레드에 할당합니다. 실제로는 시간 공유 실행이지만 이 전환 시간은 매우 짧습니다. 사용자는 동시에 느낀다!

간단한 예: QQ를 끊고 갑자기 음악을 듣고 싶습니다. QQ를 끄고 XX 플레이어를 시작해야 합니까? 답은 No 플레이어를 직접 열어보자 노래만 틀어도 QQ는 아직 돌아가고 있죠? 간단한 멀티스레딩입니다~ 실제 개발시에는 어플리케이션이 실행되는 등의 예도 있고, 새 버전을 찾았고 백그라운드에서 업데이트하려고 합니다. 이때 일반적으로 새 버전의 apk를 다운로드하기 위해 백그라운드 스레드를 엽니다. 앱의 다른 기능도 사용할 수 있습니다! 멀티스레딩을 사용한 예입니다~

2) 동기화 및 비동기성의 개념:

답변: 동기화: 특정 함수를 실행할 때 결과를 얻을 때까지 호출이 반환될 수 없습니다! 쉽게 말하면 반드시 그래야 한다는 뜻이다. 다음 작업을 수행하기 전에 이전 작업이 완료될 때까지 기다리십시오. 간단한 예를 들면 다음과 같습니다. 성관계를 갖는 경우 누군가를 죽이는 것을 방지하려면 먼저 콘돔을 착용해야 합니다. 그럼 또 섹스를 하세요, 그렇죠? 콘돔을 끼세요 -> 그럼 섹스를 하세요. 콘돔을 사서 가지고 오시면 바로 섹스를 시작하실 수 있습니다~ 생생한 예 ♪(^∇^*)Asynchronous: 우리가 특정 기능을 실행할 때 상대적으로 하는 일입니다. 즉시 결과가 필요하지 않으며 일반적으로 다른 작업을 수행하기 위해 이 함수는 우리에게 알리거나 완료 후 다시 전화할 수 있습니다. 또는 위의 백그라운드 다운로드 예, 다운로드 기능을 실행한 후에는 다운로드 프로세스에 신경 쓸 필요가 없습니다. 다운로드가 완료되면 알려주시면 됩니다~

3) Android에서 비동기 작업을 도입하는 이유는 무엇인가요?

답변: Android가 프로그램이 시작되면 해당 메인 스레드(메인 스레드)가 동시에 시작됩니다. 이 메인 스레드는 주로 처리를 담당합니다. UI 관련 이벤트! 때때로 우리는 이를 UI 스레드라고도 부릅니다! Android 앱에서는 다음과 같은 단일 스레드 모델의 규칙을 준수해야 합니다. Android UI 작업은 스레드로부터 안전하지 않으며 이러한 작업은 UI 스레드에서 실행되어야 합니다! 메인 스레드의 new Thread()와 같이 UI가 아닌 스레드에 있는 경우 다른 스레드를 열고 그 안의 UI 컨트롤 값을 직접 수정합니다. 이때 다음 예외가 발생합니다: android.view.ViewRoot$CalledFromWrongThreadException: 뷰 계층 구조를 생성한 원래 스레드만 해당 뷰에 접근할 수 있습니다.또한 시간이 많이 걸리는 작업을 모두 넣으면 또 다른 점이 있습니다. UI 스레드에서 UI 스레드가 5초 이상 요청에 응답하지 않는 경우 이때 ANR(Application Not Responding) 예외가 발생하게 되는데, 이는 애플리케이션이 응답하지 않는다는 의미입니다~ 마지막으로, Android 4.0 이후에는 UI 스레드에서 네트워크 작업을 수행하는 것이 금지됩니다. 그렇지 않으면 다음과 같이 보고됩니다. android.os.NetworkOnMainThreadException

위의 이유는 모두 Android에서 비동기 작업을 도입하는 것의 중요성을 보여줍니다. 물론 비동기 작업을 구현하는 것도 이 섹션에서는 설명할 필요가 없습니다. AsyncTask에서는 관련 작업을 완료한 후 다음 두 가지 방법을 통해 UI를 직접 열 수 있습니다.

  1. 앞서 배운 Handler는 Handler에 UI 업데이트를 작성한 다음 sendMessage()와 같은 메서드를 통해 UI에 알립니다. 업데이트, 메인 스레드에 작성된 Handler와 하위 스레드의 차이점을 잊지 마세요~
  2. Activity.runOnUiThread(Runnable)를 사용하여 Runnable에서 UI 업데이트를 위한 코드를 생성합니다. 객체를 전달하면 됩니다~
2. AsyncTask 전체 분석:

1) AsyncTask를 사용하는 이유는 무엇입니까?

답변: 위의 두 가지 방법을 사용하여 비동기 작업을 완료할 수 있습니다. 비동기 작업을 추가하려면 더 많은 내용을 작성해야 하거나 더 번거롭습니다. new Thread()를 사용한 다음 위 메서드를 사용하여 UI에 업데이트를 알려야 할까요? 프로그래머들은 공식적으로 게으른 경향이 있습니다. 우리는 캡슐화된 경량 비동기 클래스인 AsyncTask를 제공합니다. 왜 사용하지 않겠습니까? 수십 줄의 코드로 이를 수행할 수 있습니다. 비동기 작업과 진행 상황은 Handler에 비해 제어 가능하며 AsyncTask는 더 간단하고 빠릅니다. 물론 이것은 다음에만 적합합니다. 또한, 가장 일반적으로 사용되는 비동기 작업은 네트워크 작업, 이미지 로딩, 데이터 전송 등입니다. AsyncTask 당분간은 초보자의 요구를 충족할 수 있습니다. 소규모 애플리케이션에 감사드립니다. 하지만 회사에서 실제로 프로젝트를 수행한 후에는 타사 프로젝트를 더 많이 사용할 예정입니다. Volley, OkHttp, android-async-http, XUtils 등과 같은 많은 프레임워크가 있습니다. 나중에 고급 튜토리얼을 위해 1-2개의 프레임워크를 선택하겠습니다. 학습은 물론 스스로 학습할 자료를 찾을 수도 있지만, 그래도 AsyncTask를 마스터하는 것은 필요합니다!

2) AsyncTask의 기본 구조


AsyncTask는 일반적으로 AsyncTask를 상속받기 위한 클래스를 정의하고 관련 메소드를 재정의하게 됩니다~ 공식 API: AsyncTask

    AsyncTask 하위 클래스 생성을 위한 매개변수:

1.jpg

    관련 메서드 및 실행 프로세스:

2.jpg

    참고:

3.jpg

3. AsyncTask 사용 예:

아직 Android 네트워크에 대해 배우지 않았기 때문에 여기서는 모든 초보자를 처리하고 여기서는 지연을 사용하겠습니다. 파일 다운로드 과정을 시뮬레이션하는 스레드~ 나중에 네트워크에 대해 이야기할 때 몇 가지 예를 작성하겠습니다~

구현 렌더링:

4.gif

레이아웃 파일: Activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width=" match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical"  
    tools:context=".MyActivity">  
    <TextView  
        android:id="@+id/txttitle"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content" />  
    <--设置一个进degree条,并且设置为水平方向-->  ㅋㅋㅋ BarStyleHorizontal"/>  ㅋㅋㅋ />  
</LinearLayout>

다운로드 시뮬레이션을 위한 지연 작업 정의:

public class DelayOperator {
  //다운로드 시뮬레이션을 위한 지연 작업
public void Delay()
                                                       Thread.sleep(1000)
        }catch (InterruptedException  e){  
e.printStackTrace();;

맞춤형 AsyncTask:

public 클래스 MyAsyncTask는 AsyncTask<Integer,Integer,String>을 확장합니다.
{
 private TextView txt;
private ProgressBar pgbar;

public MyAsyncTask(T extView txt,ProgressBar pgbar)
                        ; This.pgbar = pgbar
}


//이 메서드는 UI 스레드에서 실행되지 않으며 주로 비동기 작업에 사용됩니다. 게시프로그레스() 메서드 호출
//onProgressUpdate를 트리거하여 UI 작동
@Override
protected String doInBackground(Integer... params) {
                                                                사용 사용 사용 - ‐           ‐   ‐                    > 사용      through off 's' through off ‐         through 's ‐     ‐ ‐ ‐ ‐            설정 UI 컨트롤
@Override
protected void onPreExecute() {
txt.setText("비동기 스레드 실행 시작~");
}


//doBackground 메서드에서는PublishProgress 메서드가 호출될 때마다 이 메서드가 트리거됩니다.
//UI 스레드에서 실행하면 UI 컨트롤을 작동할 수 있습니다.


@Override
protected void onProgressUpdate(Integer...values) {
        int 값 = = 값[0];  
        pgbar.setProgress(값);  
    }  
}

MainActivity.java

public class MyActivity는 ActionBarActivity를 확장합니다.{  
  
    private TextView txttitle;  
    비공개 ProgressBar pgbar;  
    비공개 버튼 btnupdate;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        txttitle = (TextView)findViewById(R.id.txttitle);  
        pgbar = (ProgressBar)findViewById(R.id.pgbar);  
        btnupdate = (버튼)findViewById(R.id.btnupdate);  
        btnupdate.setOnClickListener(new View.OnClickListener() {  
          @Override  
           public void onClick(View v) {  
               MyAsyncTask myTask = new MyAsyncTask(txttitle,pgbar);  
              myTask.execute(1000);  
          }  
        })  ㅋㅋㅋ步,같은 概念;接着又讲解 了下Android中为何要引入异步操작, 然后介绍了下AsyncTask적용법, 当然상면也说了, 异步操작품에서 AsyncTask 敬请期待~本节就到这里 谢谢~