Android開発のAsyncTaskの使い方
3825 ワード
Androidで非同期タスクを実現するメカニズムには、HandlerとAsyncTaskの2つの方法があります.
Handlerモードでは、タスクごとに新しいスレッドを作成する必要があります.タスクが完了した後、Handlerインスタンスを介してUIスレッドにメッセージを送信し、インタフェースの更新を完了します.この方法は、プロセス全体の制御が比較的細かくなりますが、コードが相対的に肥大化しているなど、複数のタスクが同時に実行される場合、スレッドを正確に制御することは容易ではありません.Handlerに関する知識については、前にも紹介しましたが、よくわからない方はご参照ください.
操作を簡単にするためにAndroid 1.5ツールクラスandroidが提供されています.os.AsyncTaskは、非同期タスクの作成をより簡単にし、タスクスレッドとHandlerインスタンスを記述する必要がなくなり、同じタスクを完了します.
まずAsyncTaskの定義を見てみましょう.
3つの汎用タイプは、「タスク実行を開始する入力パラメータ」、「バックグラウンドタスク実行の進捗状況」、「バックグラウンド計算結果のタイプ」を表します.特定の場合、すべてのタイプが使用するわけではない、使用されていなければjavaを使用することができる.lang.Voidタイプ代替.
非同期タスクの実行には、一般的に次のステップが含まれます.
1.execute(Params...params)は、非同期タスクを実行します.コードでこのメソッドを呼び出し、非同期タスクの実行をトリガーする必要があります.
2.onPreExecute()は、execute(Params...params)が呼び出された直後に実行され、バックグラウンドタスクを実行する前にUIにタグを付けるために一般的に使用されます.
3.doInBackground(Params...params)は、onPreExecute()が完了するとすぐに実行され、比較的時間のかかる操作を実行するために使用され、入力パラメータを受信し、計算結果を返します.実行中にpublishProgress(Progress...values)を呼び出して進捗情報を更新できます.
4.onProgressUpdate(Progress...values)は、publishProgress(Progress...values)を呼び出すと、このメソッドが実行され、直接UIコンポーネントに進捗情報が更新されます.
5.onPostExecute(Result result)バックグラウンド操作が終了すると、このメソッドが呼び出され、計算結果がパラメータとしてこのメソッドに渡され、UIコンポーネントに直接表示されます.
使用する際、注意すべき点はいくつかあります.
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回目の実行では例外が放出されます.
(以上の内容は以下から転載する:http://blog.csdn.net/liuhe688/article/details/6532519)
この方法をより深く認識するために,以下に一例として説明する.
この例では、プログレスバーのカウントダウン機能を実現します.時間が30 s長くなると、時間が経つにつれて進捗バーが徐々に短縮され、テキストボックスの残り時間も減少する.
UIスレッド:
以上,AsyncTaskを用いて非同期更新プログレスバーを実現した.プログラムの実行に影響を及ぼさず、バックグラウンドでフロントエンドUIを更新し続けることができます.
この方法は、処理の進捗、タイミング、ロードの進捗などの機能を表示するためにも使用できます.
Handlerモードでは、タスクごとに新しいスレッドを作成する必要があります.タスクが完了した後、Handlerインスタンスを介してUIスレッドにメッセージを送信し、インタフェースの更新を完了します.この方法は、プロセス全体の制御が比較的細かくなりますが、コードが相対的に肥大化しているなど、複数のタスクが同時に実行される場合、スレッドを正確に制御することは容易ではありません.Handlerに関する知識については、前にも紹介しましたが、よくわからない方はご参照ください.
操作を簡単にするためにAndroid 1.5ツールクラスandroidが提供されています.os.AsyncTaskは、非同期タスクの作成をより簡単にし、タスクスレッドとHandlerインスタンスを記述する必要がなくなり、同じタスクを完了します.
まずAsyncTaskの定義を見てみましょう.
public abstract class AsyncTask<Params, Progress, Result> {
3つの汎用タイプは、「タスク実行を開始する入力パラメータ」、「バックグラウンドタスク実行の進捗状況」、「バックグラウンド計算結果のタイプ」を表します.特定の場合、すべてのタイプが使用するわけではない、使用されていなければjavaを使用することができる.lang.Voidタイプ代替.
非同期タスクの実行には、一般的に次のステップが含まれます.
1.execute(Params...params)は、非同期タスクを実行します.コードでこのメソッドを呼び出し、非同期タスクの実行をトリガーする必要があります.
2.onPreExecute()は、execute(Params...params)が呼び出された直後に実行され、バックグラウンドタスクを実行する前にUIにタグを付けるために一般的に使用されます.
3.doInBackground(Params...params)は、onPreExecute()が完了するとすぐに実行され、比較的時間のかかる操作を実行するために使用され、入力パラメータを受信し、計算結果を返します.実行中にpublishProgress(Progress...values)を呼び出して進捗情報を更新できます.
4.onProgressUpdate(Progress...values)は、publishProgress(Progress...values)を呼び出すと、このメソッドが実行され、直接UIコンポーネントに進捗情報が更新されます.
5.onPostExecute(Result result)バックグラウンド操作が終了すると、このメソッドが呼び出され、計算結果がパラメータとしてこのメソッドに渡され、UIコンポーネントに直接表示されます.
使用する際、注意すべき点はいくつかあります.
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回目の実行では例外が放出されます.
(以上の内容は以下から転載する:http://blog.csdn.net/liuhe688/article/details/6532519)
この方法をより深く認識するために,以下に一例として説明する.
この例では、プログレスバーのカウントダウン機能を実現します.時間が30 s長くなると、時間が経つにつれて進捗バーが徐々に短縮され、テキストボックスの残り時間も減少する.
import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.TextView;
class TestAsyncTask extends AsyncTask<String, Integer, String>
{
FullscreenActivity activity;
TextView textView;
ProgressBar bar;
public TestAsyncTask(FullscreenActivity activity, TextView textView, ProgressBar bar ) {
this.activity = activity;
this.textView = textView;
this.bar = bar;
}
//TestAsyncTask , UI , ,
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
//doInBackground UI ,
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
//textView.setText(result);
super.onPostExecute(result);
}
// PreExcute AysncTask , UI
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
bar.setMax(300);
int i = 30;
while(true)
{
publishProgress((int)i);
if(i == 0 ) break;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
i--;
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
bar.setProgress(values[0]*10);
textView.setText("" + values[0] + " s");
super.onProgressUpdate(values);
}
}
UIスレッド:
new TestAsyncTask(FullscreenActivity.this, textView, bar).execute("");
以上,AsyncTaskを用いて非同期更新プログレスバーを実現した.プログラムの実行に影響を及ぼさず、バックグラウンドでフロントエンドUIを更新し続けることができます.
この方法は、処理の進捗、タイミング、ロードの進捗などの機能を表示するためにも使用できます.