androidのAsyncTask学習
17436 ワード
<!--
@page { margin: 2cm }P { margin-bottom: 0.21cm }
-->
修正されたconnect()メソッドはすでに使用可能であるように見えますが、この匿名スレッドの方法には欠陥があります.第一に、スレッドのオーバーヘッドが大きく、タスクごとにスレッドを作成する場合、アプリケーションの効率が低下します.第二に、スレッドは管理できず、匿名スレッドが作成されて起動されるとプログラムの制御を受けず、多くのリクエストが送信されると、非常に多くのスレッドが起動し、システムは重荷に耐えられない.また、新しいスレッドでUIを更新するにはhandlerを導入する必要があり、コードが非常に肥大化しているように見えます.
この問題を解決するために、OPhoneは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と同様の4つのステップに分けられる.各ステップはコールバックメソッドに対応しています.これらのメソッドはアプリケーションによって呼び出されるべきではありません.開発者がしなければならないのは、これらのメソッドを実現することです.これらのメソッドは、タスクの実行中に自動的に呼び出されます.
*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を再実行すると、Webページの内容をキャプチャするだけでなく、読み取りの進捗状況をリアルタイムで更新できます.読者は大きなページを読んで、パーセントの更新状況を見てみましょう.
1
PageTask task
=
new
PageTask();
2
task.execute(url.getText().toString());