android의 AsyncTask 학습

17527 단어 AsyncTask

<!--
@page { margin: 2cm }P { margin-bottom: 0.21cm }
-->
보아하니 수정된connect () 방법은 이미 사용할 수 있을 것 같지만, 이러한 익명 루트의 방식은 결함이 존재한다. 첫째, 루트의 비용이 비교적 크고, 모든 작업이 하나의 루트를 만들려면 응용 프로그램의 효율이 매우 낮다.둘째, 스레드를 관리할 수 없습니다. 익명의 스레드가 만들어지고 시작된 후에 프로그램의 제어를 받지 않습니다. 만약에 많은 요청이 발송되면 매우 많은 스레드가 시작되고 시스템은 무거운 부담을 감당할 수 없습니다.또한 새 스레드에서 UI를 업데이트하려면handler를 도입해야 하기 때문에 코드가 매우 비대해 보입니다. 
이 문제를 해결하기 위해 오폰은 1.5 버전에 AsyncTask를 도입했다.AsyncTask의 특징은 임무가 메인 라인 밖에서 실행되고, 리셋 방법은 메인 라인에서 실행되기 때문에Handler를 사용하는 데 가져오는 번거로움을 효과적으로 피할 수 있다.AsyncTask의 원본 코드를 보면 AsyncTask는 java를 사용합니다.util.concurrent 프레임워크는 라인과 임무의 집행을 관리한다. concurrent 프레임워크는 매우 성숙하고 효율적인 프레임워크로 엄격한 테스트를 거쳤다.이것은 AsyncTask의 디자인이 익명 라인에 존재하는 문제를 잘 해결했다는 것을 설명한다. 
AsyncTask는 추상 클래스로 하위 클래스는 추상적인 방법인 DoInBackground(Params...p)를 실현해야 한다. 이 방법에서 작업의 실행 작업을 실현해야 한다. 예를 들어 네트워크를 연결하여 데이터를 얻는 등이다.응용 프로그램의 관심 결과가 이 방법에서 되돌아오기 때문에, 보통 onPostExecute (Resultr) 방법을 실현해야 한다.주의해야 할 것은 AsyncTask가 반드시 주 스레드에 실례를 만들어야 한다는 것이다.AsyncTask는 3가지 범주 유형 Params, Progress, Result를 정의합니다. 
* Params 시작 작업의 입력 매개 변수(예: HTTP 요청 URL)*Progress 백그라운드 작업 실행 비율*Result 백그라운드에서 작업을 수행하면 String과 같은 최종 결과가 반환됩니다. 
AsyncTask의 실행은 앞에서 정의한 TaskListener와 유사하게 네 단계로 나뉜다.한 걸음 한 걸음 리셋 방법에 대응하고 주의해야 할 것은 이러한 방법은 응용 프로그램에서 호출해서는 안 된다는 것이다. 개발자가 해야 할 일은 이런 방법을 실현하는 것이다.임무를 수행하는 과정에서 이 방법들은 자동으로 호출된다. 
* onPreExecute () 작업이 실행되기 전에 이 방법을 호출하면 진행 대화상자를 표시할 수 있습니다. *doInBackground(Params...)이 방법은 백엔드 라인에서 집행되고 임무를 완성하는 주요 작업은 보통 비교적 긴 시간이 필요하다.실행 중 PublicProgress(Progress...)를 호출할 수 있습니다.작업 진행률을 업데이트합니다.*onProgressUpdate(Progress...) 이 방법은 주 스레드에서 실행되며, 작업 수행의 진도를 표시하는 데 사용됩니다. *onPostExecute(Result) 이 방법은 주 스레드에서 실행되며 작업 실행 결과는 이 방법의 매개 변수로 되돌아옵니다. 
PageTask는 AsyncTask를 확장하여 DoInBackground () 방법에서 웹 페이지 내용을 읽습니다.PageTask의 소스 코드는 다음과 같습니다.
 

  
    
1 // String,Integer,String
2 class PageTask extends AsyncTask < String, Integer, String > {
3
4 // , AsyncTask.exucute()
5 @Override
6 protected String doInBackground(String... params) {
7 try {
8 HttpClient client = new DefaultHttpClient();
9 // params[0] url
10 HttpGet get = new HttpGet(params[ 0 ]);
11 HttpResponse response = client.execute(get);
12 HttpEntity entity = response.getEntity();
13 long length = entity.getContentLength();
14 InputStream is = entity.getContent();
15 String s = null ;
16 if (is != null ) {
17 ByteArrayOutputStream baos = new ByteArrayOutputStream();
18 byte [] buf = new byte [ 128 ];
19 int ch = - 1 ;
20 int count = 0 ;
21 while ((ch = is.read(buf)) != - 1 ) {
22 baos.write(buf, 0 , ch);
23 count += ch;
24 if (length > 0 ) {
25 // , publishProgress()
26 publishProgress(( int ) ((count / ( float ) length) * 100 ));
27 }
28 // , 100ms
29 Thread.sleep( 100 );
30 }
31 s = new String(baos.toByteArray()); }
32 //
33 return s;
34 } catch (Exception e) {
35 e.printStackTrace();
36 }
37 return null ;
38 }
39 @Override
40 protected void onCancelled() {
41 super .onCancelled();
42 }
43 @Override
44 protected void onPostExecute(String result) {
45 // HTML
46 message.setText(result);
47 }
48 @Override
49 protected void onPreExecute() {
50 // , ,
51 message.setText(R.string.task_started);
52 }
53 @Override
54 protected void onProgressUpdate(Integer... values) {
55 //
56 message.setText(values[ 0 ]);
57 }
58 }

 
 
<!--
@page { margin: 2cm }P { margin-bottom: 0.21cm }
-->
PageTask를 실행하려면 다음 코드만 호출하면 됩니다.NetworkActivity를 다시 실행하면 웹 페이지의 내용을 캡처할 수 있을 뿐만 아니라 읽는 진도를 실시간으로 업데이트할 수 있습니다.독자들은 비교적 큰 웹 페이지를 읽어서 백분율의 업데이트 상황을 보려고 시도한다.

  
    
1 PageTask task = new PageTask();
2 task.execute(url.getText().toString());

 
 

좋은 웹페이지 즐겨찾기