A、AsyncTaskの紹介
1.1役割:
軽量非同期クラス、UI更新、子スレッドの中に便利。
1.2原理:
これは、ハンドラと2つのスレッド・プールをカプセル化します。AsyncTaskのソースリンク
- スレッドプールTHREAD_POOL_EXECUTOR: ThreadFactoryとスレッドプールインスタンス化するためにいくつかのパラメータによって
THREAD_POOL_EXECUTOR
タスクを実行するために使用します。 - スレッドプールSERIAL_EXECUTOR:内部クラスSerialExecutorエグゼキュータはまた、スレッドプール・オブジェクト・インスタンスを実装
SERIAL_EXECUTOR
SerialExecutor定義実行execute
する方法をタスクキュー(順番に一つずつ)シリアルおよび使用THREAD_POOL_EXECUTOR
タスクを実行します。 - WorkerRunnableオブジェクトインスタンス化AsyncTaskを作成mWorkerとFutureTaskオブジェクトmFutureを。FutureTaskはRunnableをの役割として機能し、並行クラスです。AsyncTaskとしてmFutureのタスクキューのスレッドプールSerialExecutorの実装
execute(final Runnable r)
後、パラメータ渡し、とは、実際のタスクを処理するために、シリアルラインワーカースレッドを使用します。 - mFutureのオブジェクトが作成されmWorkerのミッションにmFutureに、オブジェクトを引数として
run()
mWorkerを呼び出すときcall()
ので、メソッドcall()
メソッドは、スレッドプールで行われます。 - ハンドラのメインスレッド:そして、
call()
その後、メソッド呼び出しresult = doInBackground(mParams);
と戻り、オブジェクトを結果は、プロセスは、タスクが設定AsyncTaskの端からキャッチします取り消されました。call()
方法最後にpostResult(result);
プライマリスレッドハンドラ送信メッセージを取得してUIを更新は、メッセージタイプまたはエンドAsyncTaskに応じて決定されます。
特定の参照:AsyncTaskでソースのAndroid分析作品
1.3コア機能およびパラメータ
AsyncTaskはで、汎用的なクラスであるandroid.os
パッケージ
AsyncTaskクラス.PNG
ジェネリック型は、我々はパラメータを渡していない場合は、ボイド、以下の特定の意味に置き換えることができ、データを必要とする三つのパラメータによって定義されます。
- PARAMS:型パラメータ。
- 進捗状況:バックグラウンドタスクの種類の実装の進捗状況。
- 結果は:バックグラウンドタスクの種類の結果を返します。
AsyncTaskはまた、4つのコアメソッドを提供します。
protected void onPreExecute()
:メインスレッドの前に準備作業を呼び出す非同期タスクを実行します。protected abstract Result doInBackground(Params... var1)
:プール内の実行スレッドは、非同期タスクを実行するために使用されます。PARAMSをすることにより、この方法では、非同期タスクの入力パラメータを表しpublishProgress、更新作業進捗方法publishProgress順番に呼び出しonProgressUpdateメインスレッドの進捗の更新を達成する方法を。このメソッドが返すは、結果にonPostExecuteの方法。protected void onProgressUpdate(Progress... values)
:実行のメインスレッドでは、バックグラウンドタスクの実行スケジュールの変更は、このメソッドを呼び出します。protected void onPostExecute(Result result)
:メインスレッドの実行、非同期タスクのコールの後、結果パラメータがあるdoInBackgroundが返されます。
これらの4つの方法の順序が実行される:onPreExecute(準備) - > doInBackground(非同期バックグラウンドにおける) - > onPostExecute(処理結果)。
:そこ有用な方法でもありprotected void onCancelled()
、非同期呼び出しは、ミッションをキャンセルする場合は、今回は:onPostExecuteと呼ばれることはありません。
二、AsyncTask使用
2.1 AsyncTaskは、例を使用しています。
(1)開始及びキャンセルする活性、二つのボタンのレイアウトを作成するAsyncTaskを、状態を表示するためのTextViewを。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn_download"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始下载"/>
<Button
android:id="@+id/btn_cancel"
android:layout_below="@id/btn_download"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="取消下载"/>
<TextView
android:id="@+id/tv_statue"
android:layout_below="@id/btn_cancel"
android:textSize="15sp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
内部クラスのカスタム作成する(2)MyAsyncTaskが継承するAsyncTaskを、四大書き換え方法を:
//第一个参数:Params参数类型:String类型
//第二个参数:Progress执行进度类型:Object类型
//第三个参数:Result参数类型:Long类型
private class MyAsyncTask extends AsyncTask<String,Object,Long>{
...
@Override
protected void onPreExecute() {...}
@Override
protected Long doInBackground(String... strings) {...}
@Override
protected void onProgressUpdate(Object... values) {...}
@Override
protected void onPostExecute(Long aLong) {...}
@Override //任务取消调用
protected void onCancelled() {...}
(3)[スタート]ボタンコールが作成MyAsyncTaskをして実行しdownloadTask.execute(urls)
、着信パラメータを。
mDownButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String[] urls = {
"http://www.jianshu.com/p/d3984e7e204f",
"http://www.jianshu.com/p/8e3cfb87f35e",
"http://www.jianshu.com/p/4fbc2ea2e02b"
};
downloadTask = new MyAsyncTask();
// 这里的url也可以分成一个一个参数传递
downloadTask.execute(urls);
}
});
(4)ボタンコールキャンセルdownloadTask.cancel(true)
停止MyAsyncTaskを。
//取消按钮点击事件
downloadTask.cancel(true);
(5)doInBackground(String... strings)
実行サイクルの方法は、タスクをダウンロードし、戻り結果、二次元アレイのその定義は、最初のバイトの数であり、第二は、記事のタイトルです。
protected Long doInBackground(String... strings) {
long totalByte = 0;
for (String url:strings){
// downloadFile方法只是一个简单的下载字节流
// 返回的Object[] result是二维数组,一个是下载的字节数,一个是标题
Object[] result = downloadFile(url);
int byteCount = (int) result[0];
totalByte += byteCount;
//传递进度
publishProgress(result);
// 异步任务调用取消则跳出for循环
if(isCancelled()){
break;
}
}
return totalByte;
}
(6)次に、publishProgress(result);
データが渡されるonProgressUpdate(Object... values)
UIを更新する方法であって、この方法は、UIを更新することが可能であり、メインスレッドに切り替えられました。AsyncTaskの終了後onPostExecute(Long aLong)
方法自動的にステータスを更新するために再び呼び出されます。
@Override
protected void onPostExecute(Long aLong) {...}
結果を見て、私はソースコードのリリースの後ろになり、ダウンロードに独自のテストをキャンセル。
AsyncTaskDemo.gif
2.2 AsyncTask注意:
- AsyncTaskクラスは、メインスレッドでロードする必要があります。
- AsyncTaskオブジェクトは、メインスレッドで作成する必要があります。
- 実行方法は、UIスレッドで呼び出さなければなりません。
- A AsyncTaskオブジェクトのみをすることができ、一度行ってメソッドを実行した後にのみそれ以外の場合は、レポート実行時例外、と呼ばれることができます。
- Android1.6、AsyncTaskシリアルミッション前に、Android1.6はAsyncTaskは、スレッドプールのハンドルの並列タスクを使用し始めたとき、しかし、Android3.0初めから、順番に回避するために、並行処理のエラーが持ち込まAsyncTask、スレッドAsyncTaskの使用シリアル使命。それにもかかわらず、Android3.0以降のリリースでは、我々はまだのAsyncTaskできexecuteOnExecutorは平行法でタスクを実行します。
三、AsyncTaskの長所と短所
3.1利点:
- シンプルで迅速かつ簡単に使用します。
- UIは、タイムリーにプロセス制御を更新します。
3.2短所:
複数の非同期操作が面倒になり、UIを更新する必要があります。
3.3その他の問題:
参考記事:AsyncTaskの欠陥や問題