Androidのマルチスレッド:AsyncTaskは概要を理解し、使用

A、AsyncTaskの紹介

1.1役割:

軽量非同期クラス、UI更新、子スレッドの中に便利。

1.2原理:

これは、ハンドラと2つのスレッド・プールをカプセル化します。AsyncTaskのソースリンク

  1. スレッドプールTHREAD_POOL_EXECUTOR: ThreadFactoryとスレッドプールインスタンス化するためにいくつかのパラメータによってTHREAD_POOL_EXECUTORタスクを実行するために使用します
  2. スレッドプールSERIAL_EXECUTOR:内部クラスSerialExecutorエグゼキュータはまた、スレッドプール・オブジェクト・インスタンスを実装SERIAL_EXECUTORSerialExecutor定義実行executeする方法をタスクキュー(順番に一つずつ)シリアルおよび使用THREAD_POOL_EXECUTORタスクを実行します
  3. WorkerRunnableオブジェクトインスタンス化AsyncTaskを作成mWorkerとFutureTaskオブジェクトmFutureをFutureTaskはRunnableをの役割として機能し、並行クラスです。AsyncTaskとしてmFutureのタスクキューのスレッドプールSerialExecutorの実装execute(final Runnable r)後、パラメータ渡し、とは、実際のタスクを処理するために、シリアルラインワーカースレッドを使用します。
  4. mFutureのオブジェクトが作成されmWorkerのミッションにmFutureに、オブジェクトを引数としてrun()mWorkerを呼び出すときcall()ので、メソッドcall()メソッドは、スレッドプールで行われます。
  5. ハンドラのメインスレッド:そして、call()その後、メソッド呼び出しresult = doInBackground(mParams);と戻り、オブジェクトを結果は、プロセスは、タスクが設定AsyncTaskの端からキャッチします取り消されました。call()方法最後にpostResult(result);プライマリスレッドハンドラ送信メッセージを取得してUIを更新は、メッセージタイプまたはエンドAsyncTaskに応じて決定されます。
    特定の参照:AsyncTaskでソースのAndroid分析作品

1.3コア機能およびパラメータ

AsyncTaskはで、汎用的なクラスであるandroid.osパッケージ

AsyncTaskクラス.PNG


ジェネリック型は、我々はパラメータを渡していない場合は、ボイド、以下の特定の意味に置き換えることができ、データを必要とする三つのパラメータによって定義されます。

 

  • PARAMS:型パラメータ。
  • 進捗状況:バックグラウンドタスクの種類の実装の進捗状況。
  • 結果は:バックグラウンドタスクの種類の結果を返します。
    AsyncTaskはまた、4つのコアメソッドを提供します。
  1. protected void onPreExecute():メインスレッドの前に準備作業を呼び出す非同期タスクを実行します。
  2. protected abstract Result doInBackground(Params... var1):プール内の実行スレッドは、非同期タスクを実行するために使用されます。PARAMSをすることにより、この方法では、非同期タスクの入力パラメータを表しpublishProgress、更新作業進捗方法publishProgress順番に呼び出しonProgressUpdateメインスレッドの進捗の更新を達成する方法を。このメソッドが返すは、結果onPostExecuteの方法。
  3. protected void onProgressUpdate(Progress... values):実行のメインスレッドでは、バックグラウンドタスクの実行スケジュールの変更は、このメソッドを呼び出します。
  4. 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注意:

  1. AsyncTaskクラスは、メインスレッドでロードする必要があります。
  2. AsyncTaskオブジェクトは、メインスレッドで作成する必要があります。
  3. 実行方法は、UIスレッドで呼び出さなければなりません。
  4. A AsyncTaskオブジェクトのみをすることができ、一度行ってメソッドを実行した後にのみそれ以外の場合は、レポート実行時例外、と呼ばれることができます。
  5. Android1.6、AsyncTaskシリアルミッション前に、Android1.6はAsyncTaskは、スレッドプールのハンドルの並列タスクを使用し始めたとき、しかし、Android3.0初めから、順番に回避するために、並行処理のエラーが持ち込まAsyncTask、スレッドAsyncTaskの使用シリアル使命。それにもかかわらず、Android3.0以降のリリースでは、我々はまだのAsyncTaskできexecuteOnExecutorは平行法でタスクを実行します。

三、AsyncTaskの長所と短所

3.1利点:

  1. シンプルで迅速かつ簡単に使用します。
  2. UIは、タイムリーにプロセス制御を更新します。

3.2短所:

複数の非同期操作が面倒になり、UIを更新する必要があります。

3.3その他の問題:

参考記事:AsyncTaskの欠陥や問題

カタログ記事:
Androidのマルチスレッドは:簡単な概要を理解し、使用します

転載:https://www.jianshu.com/p/de41c082f5c1

公開された49元の記事 ウォンの賞賛2 ビュー8589

おすすめ

転載: blog.csdn.net/yangjunjin/article/details/105029190