##Androidの非同期処理「AsyncTask」について
AsyncTaskをなんとなく利用しておりましたので、改めて基礎をまとめてみました。
※主に自身の毎日の復習・学習の機会創出、アウトプットによる知識の定着を目的としております。
暖かい目で見ていただけますと幸いです。
##そもそも非同期処理とは
同期処理: あるタスクを順番に実行すること。
非同期処理:あるタスクが実行をしている際に、他のタスクが別の処理を実行すること。
##なぜ非同期処理させる必要があるのか
仮に、もし非同期処理をしなかった場合を考えてみます。
AndroidやSwift、webアプリなどででユーザーが操作している際、例えば何か情報(動画一覧・検索結果一覧など)を取得する際、同期処理だと取得の処理が終わるまではUIなどの他の処理が一切できず画面は止まったままになります。
そうなると、ユーザーからしたらアプリが止まった(バグの)ように感じてしまいます。
非同期処理で実装するとUI・画面を良い感じに見せながら、並行して情報取得(動画一覧・検索結果一覧など)の処理を実施することができます。そうすることによって、ユーザーには今情報を取得中であることを提示でき、誤解を与えずにすみます
よく見ると、YoutubeやSNSなどもロード中は画面上に動くローディング画面が表示される場面がよく見られます。
##AsyncTaskとは
Androidの非同期処理にはHandlerやThreadHandlerクラスを使うことができますが、これらのHelper ClassとしてAsyncTaskがあります。
AsyncTaskは他の方法より簡単に非同期を扱うことができますます。
##AsyncTaskの主なメソッド
###onPreExecute()
doInBackgroundメソッドの実行前にメインスレッドで実行されます。
非同期処理前に何か処理を行いたい時などに利用。
###doInBackground()
メインスレッドとは別のスレッドで実行されます。
非同期で処理したい内容を記述します。
※唯一実装が必須
###onProgressUpdate()
メインスレッドで実行されます。
途中経過をメインスレッドに返します。
非同期処理の進行状況をプログレスバーで 表示したい時などに使うことができます。
###onPostExecute()
doInBackgroundメソッドの実行後にメインスレッドで実行されます。
結果をメインスレッドに返します。
doInBackgroundメソッドの戻り値をこのメソッドの引数として受け取り、その結果を画面に反映させることができます。
※実行順番
1.onPreExecute()
2.doInBackground()
3.onProgressUpdate() ※doInBackground()で、publishProgress()が呼ばれた場合に処理。
4.onPostExecute()
##利用シーン
####STEP1:AsyncTaskを継承するクラスを作成します
class asyncTask extends android.os.AsyncTask{
@Override
protected Object doInBackground(Object... obj){
}
####STEP2: 各メソッド内容を入力(doInBackgroundは必須)
class asyncTask extends android.os.AsyncTask{
//※この引数はObject... ですが通常通り、型・個数を指定することもできます
@Override
protected Object doInBackground(Object... obj){
//ここに処理を記入
System.out.plintln("非同期処理の内容をここに記載します")
//引数を取得することもできます
String message = (String)obj[0];
}
####STEP3: メインスレッドで、STEP1,2で作成したクラスをインスタンス化し、executeメソッドで呼び出す
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// タスクの生成
mAsyncTask = new asyncTask(textView);
//タスクの実行
mAsyncTask.execute("ここにasyncTaskに渡したい引数");
}
}
##利用時の注意点
doInBackgroundで直接メインスレッドに対しての処理を行うと例外が発生します。
##まとめ
・AsyncTaskは非同期処理に利用できる
・AsyncTaskは他の方法より簡易に非同期処理を利用できる
・AsyncTaskを利用の際は、doInBackgroundは必須