1) 원칙 AsyncTask를 구현 및 응용 프로그램의 장점과 단점
AsyncTask를 경량 비동기 클래스 로이드 이벤트 직접 AsyncTask를, 클래스에 비동기 동작을 상속 할 수있다, 그리고 인터페이스 피드백 전류 제공 비동기 적 실행의 수준 의 구현 (업데이트 진행 인터페이스 UI를 통해) 최종 피드백을 메인 UI 쓰레드.
사용의 장점 :
리터의 간단하고 빠른
L 제어 방법
사용의 단점 :
사용 L 및 비동기 동작의 복수의 UI 변경의 필요성, 그것은 복잡해진다.
2) 원칙 처리기 비동기 구현 및 장점과 단점의 응용 프로그램
핸들러 핸들러, 자벌레, 메시지, 스레드 네 개의 객체를 포함하는 비동기 구현은, 프로세스는 비동기 메인 쓰레드 프로모터 스레드 (하위 스레드) àthread (서브 스레드) 실행하고 메시지를 생성하고 HandleràHandler에 메시지-àLooper을 통과하여-하기 때 루퍼는 메시지 및 UI 변경을 얻는다.
사용의 장점 :
L 명확한 구조 및 잘 정의 된 기능
여러 백그라운드 작업의 경우 L, 단순, 명확
사용의 단점 :
L 단일 배경 비동기 처리 코드가 너무 크고 너무 복잡한 구조 나타나면 (상대)
안드로이드는 개발 노력을 줄이고 AsyncTask를 제공합니다. AsyncTask를 이름에서 알 같은 것은 비동기 작업입니다 백그라운드 작업을 통해 패키지입니다.
AsyncTask를 직접 Object 클래스, 위치 android.os.AsyncTask로부터 상속. 우리는 세 가지 일반적인 매개 변수를 제공해야 AsyncTask를 작업을 사용하고, 몇 가지 방법 (적어도 부하를) 무시합니다.
AsyncTask를 세 가지 일반적인 유형에 Params, 진행 및 결과를 정의합니다.
- 같은 HTTP 요청 URL과 같은 작업 실행의 입력 매개 변수를 시작 PARAMS.
- 진행 배경 작업을 수행 할 수있는 비율입니다.
- 결과는 문자열로 백그라운드 작업의 최종 반환 결과.
중고 AsyncTask를 학생들은 비동기 데이터를로드 다음 방법 중 적어도 두 다시 작성 알고 :
- doInBackground (에 Params ...) 배경은, 시간이 많이 걸리는 작업은 여기에 배치 할 수 있습니다. 직접 UI가 조작 할 수 없습니다. 백그라운드 스레드에서 실행이 방법은 일반적으로 시간이 오래 걸립니다, 주요 작품의 작업을 완료합니다. 구현의 과정에서 작업의 진행 상황을 업데이트 할 publicProgress (진행 ...)를 호출 할 수 있습니다.
- onPostExecute 인터페이스 처리 핸들러 방식에 대응 (결과) doInBackground UI 처리 동작 한 결과를 사용할 수있다. 메인 스레드 실행이 방법은 작업의 결과가이 메소드의 리턴 파라미터로 수행
모든 다음 방법 중 세 가지 있지만, 필요하지를 다시 작성해야 필요한 경우 :
- onProgressUpdate (진행 ...) 당신은 사용자 경험을 높이기 위해 진행 표시 줄을 사용할 수 있습니다. 메인 스레드에서 실행이 방법, 작업 실행에 대한 진행 상황이 표시됩니다.
- 최종 사용자가 excute에가, 호출 작업을 실행하기 전에이 메소드를 호출 시작할 때, 당신이 여기 진행 대화 상자를 표시 할 때 onPreExecute () 다음은 인터페이스입니다.
- 사용자가 취소를 호출 할 때, 작업을 할) (onCancelled
AsyncTask를 클래스를 사용하여, 여기에 따라야합니다 몇 가지 지침은 다음과 같습니다 :
- 예 태스크는 UI 스레드에서 생성해야합니다;
- UI 스레드에서 호출되어야 방법을 실행;
- 수동으로 onPreExecute (), onPostExecute (결과), doInBackground (에 Params ...), onProgressUpdate (진행 ...) 이러한 메소드를 호출하지 마십시오;
- 이 태스크는 달리 여러 번 호출 예외가있을 것입니다, 한 번에 실행할 수 있습니다;
슈퍼 간단 AsyncTask를 예제를 이해하기 :
main.xml에
- <? XML 버전 = "1.0"인코딩 = "UTF-8"?>
- <LinearLayout을 XMLNS : 안드로이드 = "http://schemas.android.com/apk/res/android"
- 로이드 : 방향 = "수직"
- 안드로이드 : layout_width = "fill_parent"
- 안드로이드 : layout_height = "fill_parent"
- >
- <텍스트 뷰
- 안드로이드 : ID = "@ + ID / textView01"
- 안드로이드 : layout_width = "fill_parent"
- 안드로이드 : layout_height = "wrap_content"
- />
- <ProgressBar의
- 안드로이드 : ID = "@ + ID / progressBar02"
- 안드로이드 : layout_width = "fill_parent"
- 안드로이드 : layout_height = "wrap_content"
- 스타일 = "안드로이드 : ATTR / progressBarStyleHorizontal"
- />
- <버튼
- 안드로이드 : ID = "@ + ID / button03"
- 안드로이드 : layout_width = "fill_parent"
- 안드로이드 : layout_height = "wrap_content"
- 안드로이드 : 텍스트 = "업데이트 진행 막대"
- />
- </있는 LinearLayout>
MainActivity.java
- 패키지 vic.wong.main;
- 수입에는 android.app.Activity;
- 수입 android.os.Bundle;
- 수입 android.view.View에서;
- 수입 android.view.View.OnClickListener;
- 수입 android.widget.Button;
- 수입 android.widget.ProgressBar;
- 수입 android.widget.TextView;
- 공용 클래스 MainActivity는 활동을 {확장
- 개인 Button 버튼;
- 개인의 ProgressBar의 ProgressBar;
- 개인 텍스트 뷰 텍스트 뷰;
- @보수
- 공공 무효에서 onCreate (번들 savedInstanceState) {
- super.onCreate (savedInstanceState);
- 된 setContentView (R.layout.main);
- = 버튼 (버튼) findViewById를 (R.id.button03);
- 진행 막대 = (ProgressBar의) findViewById를 (R.id.progressBar02);
- 텍스트 뷰 = (텍스트 뷰) findViewById를 (R.id.textView01);
- button.setOnClickListener (새 OnClickListener를 () {
- @보수
- 공공 무효의 onclick (보기 V) {
- ProgressBarAsyncTask AsyncTask를 = 새로운 ProgressBarAsyncTask (텍스트 뷰, 진행 막대);
- asyncTask.execute (1000);
- }
- });
- }
- }
NetOperator.java
- 패키지 vic.wong.main;
- // 시뮬레이션 네트워크 환경
- 공용 클래스 NetOperator {
- 공공 무효 연산자 () {
- {시도
- // 수면 일초
- Thread.sleep를 (1000);
- } 캐치 (예외 : InterruptedException 전자) {
- // TODO 자동 생성 된 catch 블록
- e.printStackTrace ();
- }
- }
- }
ProgressBarAsyncTask의 된 .java
- 패키지 vic.wong.main;
- 수입 android.os.AsyncTask;
- 수입 android.widget.ProgressBar;
- 수입 android.widget.TextView;
- / **
- * 실행 메소드를 객체 클래스를 생성하고, 호출 한 후
- * OnProExecute 방법은 먼저 수행
- * 제 2 실행 방법 doInBackgroup
- *
- * /
- 공용 클래스 ProgressBarAsyncTask은 AsyncTask를 확장 < 정수, 정수, 문자열 > {
- 개인 텍스트 뷰 텍스트 뷰;
- 개인의 ProgressBar의 ProgressBar;
- 공공 ProgressBarAsyncTask (텍스트 뷰 텍스트 뷰, ProgressBar를 진행 막대) {
- 감독자();
- this.textView = 텍스트 뷰;
- this.progressBar = 진행 막대;
- }
- / **
- 정수 * 여기에 인수의 첫 번째 매개 변수에 해당 AsyncTask를
- * 문자열이 세번째 파라미터 AsyncTask를 반환 값에 대응
- *이 방법은 주로 비동기 작업에 사용되는 UI 스레드에서 실행되지 않는 모든 공간이 방법에서 UI 및 변형 사이에서 제공 할 수없는
- * 인터페이스 동작 onProgressUpdate 그러나, 상기 방법이라 할 수 publishProgress 트리거
- * /
- @보수
- 보호 된 문자열 doInBackground (정수 ... PARAMS) {
- NetOperator netOperator = 새로운 NetOperator ();
- int로 I = 0;
- 대 ( I = (10) 내가 <= 100; + I = 10) {
- netOperator.operator ();
- publishProgress (I);
- }
- 난 "PARAMS [0] .intValue () +"를 반환 +;
- }
- / **
- AsyncTask를에게 세번째 파라미터 화라 대응 * 문자열 파라미터 (즉 doInBackground는 리턴 값을 수신)
- * 실행 doInBackground 방법 후에 실행에서, UI 및 공간 중 UI 스레드에서 실행되도록 설정 될 수있다
- * /
- @보수
- 보호 무효 onPostExecute (문자열 결과) {
- textView.setText (+ 결과 "비동기 작업 실행은 완료");
- }
- //이 방법은 UI를 스레드에서 실행 및 UI 공간 사이의 UI 스레드에서 실행되도록 설정할 수 있습니다
- @보수
- 보호 공극 onPreExecute () {
- textView.setText ( "비동기 스레드를 수행하기 시작");
- }
- / **
- * 여기 Intege 파라미터는 제 AsyncTask를 파라미터에 대응
- * DoInBackground 각 호 publishProgress ,,이 방법의 실행을 트리거하는 방법 onProgressUpdate
- * OnProgressUpdate는 UI 스레드에서 실행되고, 모든 UI 스페이스를 조작 할 수있다
- * /
- @보수
- 보호 공극 onProgressUpdate (정수 값 ...) {
- INT vlaue = 값 [0];
- progressBar.setProgress (vlaue);
- }
- }
HTTPS : //my.oschina.net/yourpapa/blog/621603 재현