15-멀티스레드 프로그래밍(01-AsyncTask 비동기식 작업 소개 1)

AsyncTask 클래스:
1.1 개요
Android에서 제공하는 AsyncTask 클래스는 사용자 인터페이스와 상호작용을 해야 하는 장시간 실행되는 작업을 만드는 것을 더욱 간단하게 합니다.
1.2 AsyncTask의 하위 클래스 정의
AsyncTask는 다음과 같이 하위 클래스를 정의하여 제공되는 기능을 사용하는 추상 클래스입니다.
    class MyAsyncTask extends AsyncTask<Params, Integer, Result> {

		@Override
		protected Result doInBackground(Params... params) {
			//             
			return null;
		}
		
		@Override
		protected void onPostExecute(Result result) {
			super.onPostExecute(result);
		}	
    }

설명:
AsyncTask는 Params, Integer 및 Result라는 세 가지 범주 유형의 매개변수를 정의합니다.
Params: 작업 실행을 시작하는 입력 매개변수, 즉 DoInBackground 메서드의 참조 params입니다.
Integer: 백그라운드 작업 실행 비율입니다.
Result: 백그라운드 실행 작업이 마지막으로 반환된 결과입니다.
AsyncTask 사용 단계(개발자가 각 단계에서 수행하는 콜백 방법):
1단계: AsyncTask를 상속합니다.
2단계: AsyncTask에 정의된 다음 방법 또는 몇 가지 구현
onPreExecute ()

작업이 실행되기 전에 이 방법을 먼저 호출합니다
doInBackground

이 방법은 백엔드 라인에서 실행됩니다. 이것은 시간이 많이 걸리는 백엔드 계산 작업을 수행하는 것을 책임질 것입니다.publish Progress 방법을 호출하여 실시간 작업의 진도를 업데이트할 수 있습니다. 이 방법은 추상적인 방법입니다. 하위 클래스는 반드시 실현되어야 합니다.
protected final void publishProgress(Progress... values)

doInBackground 메서드에서 업데이트된 진행률 값을 onProgressUpdate 메서드에 전달합니다.
protected void onProgressUpdate (Progress... values)

publish Progress 방법이 호출되면 UI 스레드는 이 방법을 호출하여 인터페이스에서 작업의 진행 상황을 보여 줍니다. 예를 들어 하나의 진도표를 통해 보여 줍니다.
values는 일반적으로 성형 변수로 계산된 진도 값을 얻는다.
protected void onPostExecute (Result result)
doInBackground가 실행된 후에opPostExecute 방법은 UI 스레드에 호출되고 백엔드의 계산 결과는 이 방법을 통해 UI 스레드에 전달됩니다.
3단계: AnsycTask 인스턴스는 UI 스레드에서 생성됩니다.
4단계: excute 메서드는 UI 스레드에서 호출됩니다.
AsyncTask 클래스를 올바르게 사용하기 위해 준수해야 하는 몇 가지 지침은 다음과 같습니다.
1) Task의 인스턴스는 UI thread에서 생성되어야 합니다. 2) excute 방법은 UI thread에서 3을 호출해야 합니다. onPreExecute(), onPostExecute(Result), doInBackground(Params),onProgressUpdate(Progress...)이 몇 가지 방법 4) 이task는 한 번만 실행할 수 있습니다. 그렇지 않으면 여러 번 호출할 때 이상doInBackground 방법과 onPostExecute의 매개 변수가 대응해야 합니다. 이 두 매개 변수는 AsyncTask가 성명한 일반 매개 변수 목록에서 지정됩니다. 첫 번째는doInBackground가 받은 매개 변수이고 두 번째는 진도를 표시하는 매개 변수입니다.세 번째는 DoInBackground 반환과 onPostExecute에서 전송된 인자입니다.
예: 비동기식 로드 이미지:
activity_main.xml:
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:onClick="downloadImg"
        android:text="    " />

    <ImageView
        android:id="@+id/iv_download"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true" />

</RelativeLayout>

MainActivity.java:
package net.csdn.leigo.asynctask;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private ProgressDialog progressDialog;
	private ImageView mDownloadImg;
	private static final String IMG_URL = "http://p1.qhimg.com/d/_onebox/search.png";

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

		mDownloadImg = (ImageView) findViewById(R.id.iv_download);

		progressDialog = new ProgressDialog(this);
		progressDialog.setTitle("    ");
		progressDialog.setMessage("     ,   ...");
	}

	public void downloadImg(View v) {
		new MyAsyncTask().execute(IMG_URL);

	}

	class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {

		//          
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			progressDialog.show();

		}

		//         
		@Override
		protected Bitmap doInBackground(String... params) {

			//        HttpClient           
			HttpClient httpClient = new DefaultHttpClient();
			HttpGet httpGet = new HttpGet(params[0]);
			Bitmap bitmap = null;
			try {
				HttpResponse httpResponse = httpClient.execute(httpGet);
				if (httpResponse.getStatusLine().getStatusCode() == 200) {
					HttpEntity httpEntity = httpResponse.getEntity();
					byte[] data = EntityUtils.toByteArray(httpEntity);
					bitmap = BitmapFactory
							.decodeByteArray(data, 0, data.length);

				}

			} catch (ClientProtocolException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			return bitmap;
		}

		//      UI  
		@Override
		protected void onPostExecute(Bitmap result) {
			super.onPostExecute(result);
			progressDialog.dismiss();
			mDownloadImg.setImageBitmap(result);
		}

	}

}
팁:
1. 비동기 작업 대상은 한 번만 실행할 수 있습니다(execute 방법은 한 번만 호출할 수 있습니다).
2. 비동기 작업 대상의 스레드는 스레드 탱크를 사용했다.

좋은 웹페이지 즐겨찾기