4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Androidの非同期処理「AsyncTask」の基本の基

Posted at

##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は必須

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?