AsyncTask를 원칙의 실현, 그리고 장점과 단점을 적용

1) 원칙 AsyncTask를 구현 및 응용 프로그램의 장점과 단점

AsyncTask를 경량 비동기 클래스 로이드 이벤트 직접 AsyncTask를, 클래스에 비동기 동작을 상속 할 수있다, 그리고 인터페이스 피드백 전류 제공 비동기 적 실행의 수준 의 구현 (업데이트 진행 인터페이스 UI를 통해) 최종 피드백을 메인 UI 쓰레드.

사용의 장점 :

리터의 간단하고 빠른

L 제어 방법

       

사용의 단점 :

사용 L 및 비동기 동작의 복수의 UI 변경의 필요성, 그것은 복잡해진다.

2) 원칙 처리기 비동기 구현 및 장점과 단점의 응용 프로그램

핸들러 핸들러, 자벌레, 메시지, 스레드 네 개의 객체를 포함하는 비동기 구현은, 프로세스는 비동기 메인 쓰레드 프로모터 스레드 (하위 스레드) àthread (서브 스레드) 실행하고 메시지를 생성하고 HandleràHandler에 메시지-àLooper을 통과하여-하기 때 루퍼는 메시지 및 UI 변경을 얻는다.

사용의 장점 :

L 명확한 구조 및 잘 정의 된 기능

여러 백그라운드 작업의 경우 L, 단순, 명확

   

사용의 단점 :

L 단일 배경 비동기 처리 코드가 너무 크고 너무 복잡한 구조 나타나면 (상대)

 
소개 AsyncTask를
안드로이드의 처리기 AsyncTask를 간단한 비동기 처리에 대한 몇 가지보다 더 가볍고.
첫째, 안드로이드 핸들러와 AsyncTask를이 모든 메인 스레드 (UI 스레드)를 차단하고, UI는 메인 스레드에서 수행 할 수 있습니다 업데이트하지 않기 위해, 비동기 처리 따라서 불가피 왜 명확한 이유가있다.
 

안드로이드는 개발 노력을 줄이고 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에

  1. <? XML 버전 = "1.0"인코딩 = "UTF-8"?>  
  2. <LinearLayout을 XMLNS : 안드로이드 = "http://schemas.android.com/apk/res/android"  
  3.     로이드 : 방향 = "수직"  
  4.     안드로이드 : layout_width = "fill_parent"  
  5.     안드로이드 : layout_height = "fill_parent"  
  6.     >  
  7.     <텍스트 뷰    
  8.     안드로이드 : ID = "@ + ID / textView01"  
  9.     안드로이드 : layout_width = "fill_parent"   
  10.     안드로이드 : layout_height = "wrap_content"   
  11.     />  
  12.    <ProgressBar의   
  13.    안드로이드 : ID = "@ + ID / progressBar02"  
  14.     안드로이드 : layout_width = "fill_parent"   
  15.     안드로이드 : layout_height = "wrap_content"   
  16.     스타일 = "안드로이드 : ATTR / progressBarStyleHorizontal"   
  17.     />  
  18.     <버튼  
  19.     안드로이드 : ID = "@ + ID / button03"  
  20.     안드로이드 : layout_width = "fill_parent"   
  21.     안드로이드 : layout_height = "wrap_content"   
  22.     안드로이드 : 텍스트 = "업데이트 진행 막대"  
  23.     />  
  24. </있는 LinearLayout>  


MainActivity.java

  1. 패키지 vic.wong.main;  
  2.   
  3. 수입에는 android.app.Activity;  
  4. 수입 android.os.Bundle;  
  5. 수입 android.view.View에서;  
  6. 수입 android.view.View.OnClickListener;  
  7. 수입 android.widget.Button;  
  8. 수입 android.widget.ProgressBar;  
  9. 수입 android.widget.TextView;  
  10.   
  11. 공용 클래스 MainActivity는 활동을 {확장  
  12.     개인 Button 버튼;  
  13.     개인의 ProgressBar의 ProgressBar;  
  14.     개인 텍스트 뷰 텍스트 뷰;  
  15.       
  16.     @보수  
  17.     공공 무효에서 onCreate (번들 savedInstanceState) {  
  18.         super.onCreate (savedInstanceState);  
  19.         된 setContentView (R.layout.main);  
  20.           
  21.         = 버튼 (버튼) findViewById를 (R.id.button03);  
  22.         진행 막대 = (ProgressBar의) findViewById를 (R.id.progressBar02);  
  23.         텍스트 뷰 = (텍스트 뷰) findViewById를 (R.id.textView01);  
  24.           
  25.         button.setOnClickListener (새 OnClickListener를 () {  
  26.               
  27.             @보수  
  28.             공공 무효의 onclick (보기 V) {  
  29.                 ProgressBarAsyncTask  AsyncTask를 =  새로운 ProgressBarAsyncTask (텍스트 뷰, 진행 막대);  
  30.                 asyncTask.execute (1000);  
  31.             }  
  32.         });  
  33.     }  
  34. }  

 


NetOperator.java

  1. 패키지 vic.wong.main;  
  2.   
  3.   
  4. // 시뮬레이션 네트워크 환경  
  5. 공용 클래스 NetOperator {  
  6.       
  7.     공공 무효 연산자 () {  
  8.         {시도  
  9.             // 수면 일초  
  10.             Thread.sleep를 (1000);  
  11.         } 캐치 (예외 : InterruptedException 전자) {  
  12.             // TODO 자동 생성 된 catch 블록  
  13.             e.printStackTrace ();  
  14.         }  
  15.     }  
  16.   
  17. }  

 


ProgressBarAsyncTask의 된 .java 

  1. 패키지 vic.wong.main;  
  2. 수입 android.os.AsyncTask;  
  3. 수입 android.widget.ProgressBar;  
  4. 수입 android.widget.TextView;  
  5.   
  6. / **  
  7.  * 실행 메소드를 객체 클래스를 생성하고, 호출 한 후  
  8.  * OnProExecute 방법은 먼저 수행  
  9.  * 제 2 실행 방법 doInBackgroup  
  10.  *  
  11.  * /  
  12. 공용 클래스 ProgressBarAsyncTask은 AsyncTask를 확장 < 정수, 정수, 문자열 > {  
  13.   
  14.     개인 텍스트 뷰 텍스트 뷰;  
  15.     개인의 ProgressBar의 ProgressBar;  
  16.       
  17.       
  18.     공공 ProgressBarAsyncTask (텍스트 뷰 텍스트 뷰, ProgressBar를 진행 막대) {  
  19.         감독자();  
  20.         this.textView = 텍스트 뷰;  
  21.         this.progressBar = 진행 막대;  
  22.     }  
  23.   
  24.   
  25.     / **  
  26.      정수 * 여기에 인수의 첫 번째 매개 변수에 해당 AsyncTask를   
  27.      * 문자열이 세번째 파라미터 AsyncTask를 반환 값에 대응  
  28.      *이 방법은 주로 비동기 작업에 사용되는 UI 스레드에서 실행되지 않는 모든 공간이 방법에서 UI 및 변형 사이에서 제공 할 수없는  
  29.      * 인터페이스 동작 onProgressUpdate 그러나, 상기 방법이라 할 수 publishProgress 트리거  
  30.      * /  
  31.     @보수  
  32.     보호 된 문자열 doInBackground (정수 ... PARAMS) {  
  33.         NetOperator  netOperator =  새로운 NetOperator ();  
  34.         int로  I =  0;  
  35.         대 ( I =  (10) 내가  <= 100; + I = 10) {  
  36.             netOperator.operator ();  
  37.             publishProgress (I);  
  38.         }  
  39.         난 "PARAMS [0] .intValue () +"를 반환 +;  
  40.     }  
  41.   
  42.   
  43.     / **  
  44.      AsyncTask를에게 세번째 파라미터 화라 대응 * 문자열 파라미터 (즉 doInBackground는 리턴 값을 수신)  
  45.      * 실행 doInBackground 방법 후에 실행에서, UI 및 공간 중 UI 스레드에서 실행되도록 설정 될 수있다  
  46.      * /  
  47.     @보수  
  48.     보호 무효 onPostExecute (문자열 결과) {  
  49.         textView.setText (+ 결과 "비동기 작업 실행은 완료");  
  50.     }  
  51.   
  52.   
  53.     //이 방법은 UI를 스레드에서 실행 및 UI 공간 사이의 UI 스레드에서 실행되도록 설정할 수 있습니다  
  54.     @보수  
  55.     보호 공극 onPreExecute () {  
  56.         textView.setText ( "비동기 스레드를 수행하기 시작");  
  57.     }  
  58.   
  59.   
  60.     / **  
  61.      * 여기 Intege 파라미터는 제 AsyncTask를 파라미터에 대응  
  62.      * DoInBackground 각 호 publishProgress ,,이 방법의 실행을 트리거하는 방법 onProgressUpdate  
  63.      * OnProgressUpdate는 UI 스레드에서 실행되고, 모든 UI 스페이스를 조작 할 수있다  
  64.      * /  
  65.     @보수  
  66.     보호 공극 onProgressUpdate (정수 값 ...) {  
  67.         INT  vlaue =  값 [0];  
  68.         progressBar.setProgress (vlaue);  
  69.     }  
  70.   
  71.       
  72.       
  73.       
  74.   

HTTPS : //my.oschina.net/yourpapa/blog/621603 재현

추천

출처blog.csdn.net/weixin_33810006/article/details/92033270