Androidノート(十三)AsyncTask(一)
非同期タスクの主な役割は、時間のかかる操作を処理し、ユーザーに良好なユーザー体験をもたらすことです.次に、非同期タスクを新規作成し、画像をダウンロードするタスクを完了します.
一、まず、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回目の実行では例外が放出されます.
二、レイアウトを確立し、ボタンをクリックすることで非同期タスクを実行する.
三、MainActivityはコードを書く前に、タスクにネットワークダウンロードを実現する権限を与える必要がある.登録ファイルに権限を追加します.uses-permission android:name="android.permission.INTERNET”
四、効果は図のように
一、まず、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();
}
}
}
四、効果は図のように