asynctask 의 용법 상세 설명

6993 단어 asynctask
Android 애플 리 케 이 션 을 개발 할 때 단일 스 레 드 모델 의 원칙 을 지 켜 야 합 니 다.Android UI 작업 은 스 레 드 가 안전 한 것 이 아니 라 UI 스 레 드 에서 실행 되 어야 합 니 다.단일 스 레 드 모델 에 서 는 두 가지 법칙 을 항상 기억 해 야 합 니 다.1.UI 스 레 드 를 막 지 마 십시오.2.UI 스 레 드 에서 만 안 드 로 이 드 UI 패 키 지 를 방문 하여 프로그램 이 처음 시 작 될 때 안 드 로 이 드 는 해당 하 는 메 인 스 레 드(Main Thread)를 동시에 시작 합 니 다.메 인 스 레 드 는 UI 와 관련 된 이 벤트 를 처리 합 니 다.예 를 들 어 사용자 의 버튼 이벤트,사용자 가 화면 에 접촉 한 이벤트 와 화면 그래 픽 이 벤트 를 해당 하 는 구성 요소 에 나 누 어 처리 합 니 다.그래서 메 인 스 레 드 는 보통 UI 스 레 드 라 고도 부른다.예 를 들 어 인터넷 에서 웹 페이지 를 가 져 오고 TextView 에서 소스 코드 를 표시 합 니 다.이러한 네트워크 작업 과 관련 된 프로그램 은 일반적으로 하나의 스 레 드 를 열 어 네트워크 접근 을 완성 해 야 하지만 페이지 소스 코드 를 얻 은 후에 네트워크 작업 스 레 드 에서 TextView 를 직접 사용 할 수 없습니다.setText()는 다른 스 레 드 에서 주 UI 스 레 드 구성원 에 게 직접 접근 할 수 없 기 때 문 입 니 다.안 드 로 이 드 는 다른 스 레 드 에서 UI 스 레 드 에 접근 하 는 몇 가지 방법 을 제공 합 니 다.Activity.runOnUiThread(Runnable)View.post(Runnable)View.postDelayed(Runnable,long)Hanlder 와 같은 종류 나 방법 은 코드 를 복잡 하 게 이해 하기 어렵다.하지만 복잡 한 작업 을 수행 하고 UI 를 자주 업데이트 해 야 할 때 더 나 빠 집 니 다.이 문 제 를 해결 하기 위해 Android 1.5 는 도구 클래스 를 제공 합 니 다.AsyncTask 는 사용자 인터페이스 와 상호작용 을 해 야 하 는 장시간 실행 되 는 작업 을 만 드 는 것 을 더욱 간단 하 게 합 니 다.상대 적 으로 AsyncTask 는 경량급 으로 간단 한 비동기 처리 에 적용 되 며 스 레 드 와 Handler 를 빌 리 지 않 아 도 된다.AsyncTask 는 추상 적 인 클래스 입 니 다.AsyncTask 는 세 가지 일반적인 유형 인 Params,Progress 와 Result 를 정의 합 니 다.Params 가 작업 을 시작 할 때 실행 할 입력 인자,예 를 들 어 HTTP 가 요청 한 URL 입 니 다.Progress 배경 작업 수행 의 백분율 입 니 다.Result 배경 에서 작업 을 수행 하고 최종 적 으로 돌아 온 결과,예 를 들 어 String.AsyncTask 의 실행 은 네 가지 절차 로 나 뉘 는데 모든 단계 가 하나의 리 셋 방법 에 대응 합 니 다.이런 방법 은 응용 프로그램 에서 호출 되 어 서 는 안 됩 니 다.개발 자가 해 야 할 일 은 바로 이러한 방법 을 실현 하 는 것 입 니 다.1)하위 클래스 AsyncTask 2)는 AsyncTask 에서 정의 하 는 다음 이나 몇 가지 방법 인 onPreExecute()를 실현 합 니 다.이 방법 은 실제 배경 작업 을 수행 하기 전에 UI thread 에서 호출 됩 니 다.인터페이스 에 진도 표시 줄 을 표시 하 는 등 이 방법 에서 준비 작업 을 할 수 있 습 니 다.doInBackground(Params...)는 onPreExecute 방법 이 실 행 된 후 바로 실 행 됩 니 다.이 방법 은 배경 스 레 드 에서 실 행 됩 니 다.이곳 은 주로 시간 이 많이 걸 리 는 백 스테이지 계산 업 무 를 수행 할 것 이다.PublishProgress 방법 을 사용 하여 실시 간 작업 진 도 를 업데이트 할 수 있 습 니 다.이 방법 은 추상 적 인 방법 으로 자 류 는 반드시 실현 해 야 한다.onProgressUpdate(Progress...),publish Progress 방법 이 호출 되면 UI thread 는 이 방법 을 사용 하여 인터페이스 에서 작업 의 진행 상황 을 보 여 줍 니 다.예 를 들 어 하나의 진행 항목 을 통 해 보 여 줍 니 다.onPostExecute(Result),doInBackground 에서 실 행 된 후 onPostExecute 방법 은 UI thread 에서 호출 되 며,배경 계산 결 과 는 이 방법 을 통 해 UI thread 에 전 달 됩 니 다.AsyncTask 클래스 를 정확하게 사용 하기 위해 서 는다음은 몇 가지 지 켜 야 할 준칙 입 니 다.1)Task 의 인 스 턴 스 는 UI thread 에서 2)execute 방법 을 만들어 야 합 니 다.UI thread 에서 3)onPreExecute(),onPost Execute(Result),doInBackground(Params...),onProgressUpdate(Progress...)를 수 동 으로 호출 하지 마 십시오.4)이 task 는 한 번 만 실 행 될 수 있 습 니 다.그렇지 않 으 면 여러 번 호출 될 때 이상 한 doInBackground 방법 과 onPost Execute 의 매개 변 수 는 대응 해 야 합 니 다.이 두 매개 변 수 는 AsyncTask 가 설명 한 일반적인 매개 변수 목록 에서 지정 합 니 다.첫 번 째 는 doInBackground 가 받 아들 인 매개 변수 이 고 두 번 째 는 진 도 를 표시 하 는 매개 변수 이 며 세 번 째 는 doInBackground 반환 과 onPost Execute 가 들 어 오 는 매개 변수 입 니 다.인터넷 에서 웹 페이지 를 가 져 오고 TextView 에서 소스 코드 를 표시 합 니 다

package test.list;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.ArrayList;

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

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class NetworkActivity extends Activity{
private TextView message;
private Button open;
private EditText url;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.network);
message= (TextView) findViewById(R.id.message);
url= (EditText) findViewById(R.id.url);
open= (Button) findViewById(R.id.open);
open.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
connect();
}
});

}

private void connect() {
PageTask task = new PageTask(this);
task.execute(url.getText().toString());
}


class PageTask extends AsyncTask<String, Integer, String> {
// , AsyncTask.exucute()
ProgressDialog pdialog;
public PageTask(Context context){
pdialog = new ProgressDialog(context, 0);
pdialog.setButton("cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int i) {
dialog.cancel();
}
});
pdialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
finish();
}
});
pdialog.setCancelable(true);
pdialog.setMax(100);
pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pdialog.show();


}
@Override
protected String doInBackground(String... params) {

try{

HttpClient client = new DefaultHttpClient();
// params[0] url
HttpGet get = new HttpGet(params[0]);
HttpResponse response = client.execute(get);
HttpEntity entity = response.getEntity();
long length = entity.getContentLength();
InputStream is = entity.getContent();
String s = null;
if(is != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] buf = new byte[128];

int ch = -1;

int count = 0;

while((ch = is.read(buf)) != -1) {

baos.write(buf, 0, ch);

count += ch;

if(length > 0) {
// , publishProgress()
publishProgress((int) ((count / (float) length) * 100));
}

// 100ms
Thread.sleep(100);
}
s = new String(baos.toByteArray()); }
//
return s;
} catch(Exception e) {
e.printStackTrace();

}

return null;

}

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

@Override
protected void onPostExecute(String result) {
// HTML
message.setText(result);
pdialog.dismiss();
}

@Override
protected void onPreExecute() {
// , ,
message.setText(R.string.task_started);
}

@Override
protected void onProgressUpdate(Integer... values) {
//
System.out.println(""+values[0]);
message.setText(""+values[0]);
pdialog.setProgress(values[0]);
}

}

}
.마지막 으로 AsyncTask 가 스 레 드 를 완전히 대체 할 수 없다 는 것 을 설명 해 야 합 니 다.일부 논리 가 복잡 하거나 배경 에서 반복 적 으로 실행 해 야 하 는 논 리 는 스 레 드 가 필요 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기