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());
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android Activity에서 YouTube 동영상을 전체 화면으로 표시Android 개발이었던 한 가지 과제는 다음과 같습니다. 하나의 활동에 WebView가 있습니다. 그 WebView의 내용은 YouTube 동영상을 임베드한 Iframe입니다. 당연히 WebView 화면의 재생 버...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.