Androidノート(十三)AsyncTask(一)

7732 ワード

非同期タスクの主な役割は、時間のかかる操作を処理し、ユーザーに良好なユーザー体験をもたらすことです.次に、非同期タスクを新規作成し、画像をダウンロードするタスクを完了します.
一、まず、AsyncTaskの基本的な使い方を見てみましょう.AsyncTaskは抽象的なクラスなので、使いたい場合は、継承するサブクラスを作成する必要があります.継承時にAsyncTaskクラスに3つの汎用パラメータを指定できます.この3つのパラメータの用途は次のとおりです.1.ParamsがAsyncTaskを実行するときに入力するパラメータで、バックグラウンドタスクで使用できます.2.Progressバックグラウンドタスクの実行時に、現在の進捗をインタフェースに表示する必要がある場合は、ここで指定した汎用型を進捗単位として使用します.3.Resultタスクの実行後、結果を返す必要がある場合は、ここで指定した汎用型を戻り値タイプとして使用します.
タスクのカスタマイズを完了するには、AsyncTaskのいくつかの方法を書き換える必要があります.よく書き直す方法は以下の4つです.1.onPreExecute()このメソッドは、バックグラウンドタスクの実行が開始される前に呼び出され、進捗バーダイアログの表示など、インタフェース上の初期化操作を行うために使用されます.2.doInBackground(Params...)このメソッドのすべてのコードはサブスレッドで実行されます.ここでは、すべての時間のかかるタスクを処理する必要があります.タスクが完了するとreturn文でタスクの実行結果を返すことができます.なお、この方法ではUI操作はできません.現在のタスクの実行進捗状況をフィードバックするなど、UI要素を更新する必要がある場合は、publishProgress(Progress...)メソッドを呼び出して完了することができます.3.onProgressUpdate(Progress...)バックグラウンドタスクでpublishProgress(Progress...)メソッドを呼び出すと、このメソッドはすぐに呼び出され、メソッドに含まれるパラメータはバックグラウンドタスクで渡されます.この方法ではUIを操作することができ,パラメータの数値を用いてインタフェース要素を相応に更新することができる.4.onPostExecute(Result)バックグラウンドタスクが実行され、return文で返されると、このメソッドはすぐに呼び出されます.返されたデータはパラメータとしてこのメソッドに渡され、返されたデータを使用して、タスクの実行結果を通知したり、進捗バーのダイアログボックスを閉じたりするなど、UI操作を行うことができます.
また、AsyncTaskを使用する場合は、1.非同期タスクのインスタンスはUIスレッドで作成する必要があります.
2.execute(Params...params)メソッドはUIスレッドで呼び出さなければなりません.
3.onPreExecute()、doInBackground(Params...params)、onProgressUpdate(Progress...values)、onPostExecute(Result result)のいくつかの方法は手動で削除しないでください.
4.UIコンポーネントの情報をdoInBackground(Params...params)で変更することはできません.
5.1つのタスクインスタンスは1回しか実行できません.2回目の実行では例外が放出されます.
二、レイアウトを確立し、ボタンをクリックすることで非同期タスクを実行する.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >

    <Button  android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="    " />

    <ImageView  android:id="@+id/image" android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" />

</LinearLayout>

三、MainActivityはコードを書く前に、タスクにネットワークダウンロードを実現する権限を与える必要がある.登録ファイルに権限を追加します.uses-permission android:name="android.permission.INTERNET”
public class MainActivity extends ActionBarActivity {

    private Button button;
    private ImageView image;
    private String image_path = "http://img1.3lian.com/img2008/06/019/13.jpg";
    private ProgressDialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        image = (ImageView) findViewById(R.id.image);
        dialog = new ProgressDialog(this);
        dialog.setTitle("    ");
        dialog.setMessage("    ,   ...");
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new Mytask().execute(image_path);
            }
        });
    }

    public class Mytask extends AsyncTask<String, Void, Bitmap> {//   

        @Override
        protected Bitmap doInBackground(String... params) {
            // TODO Auto-generated method stub
            HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(params[0]);
            Bitmap bitmap = null;
            try {
                HttpResponse httpResponse = httpClient.execute(httpGet);
                if (httpResponse.getStatusLine().getStatusCode() == 200) {
                    HttpEntity httpEntity = httpResponse.getEntity();
                    byte[] data = EntityUtils.toByteArray(httpEntity);
                    bitmap = BitmapFactory
                            .decodeByteArray(data, 0, data.length);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            dialog.dismiss();
            image.setImageBitmap(result);
        }

        @Override
        protected void onPreExecute() {//         
            // TODO Auto-generated method stub
            super.onPreExecute();
            dialog.show();
        }
            }
    }

四、効果は図のように