[Android] 非同期処理 AsyncTaskの使い方

asynctask 01 - [Android] 非同期処理 AsyncTaskの使い方
非同期処理が必要なケースは、メインスレッドでアプリがUIを表示させたり、ユーザーが入力したりしている裏でいろいろと処理をして欲しい場合です。ネットからファイルをダウンロードするような場合も非同期にしたほうがいいでしょう。
 
また、AsyncTaskではそのままViewの参照をするとメモリリークを発生させる可能性があります。WeakReferenceを使うこともできますが、Listenerを使うやり方を実装してみました。

Android Studio 3.4.2
API 29
AndroidX



AsyncTask

 
非同期にはHandlerやThreadを使いますが、そのHelper ClassとしてAsyncTaskがあり簡単に非同期を扱うことができます。

また、GoogleのReferenceによれば、スレッドを長期間継続させる場合には使用せず、数秒程度の処理にすべきとのことです。
 

 

AsyncTaskの基本的構造

 
AsynTaskはbackground Threadで実行されその結果をUI threadに表示させます。基本的な構造は、

 
非同期を実装するためにAsyncTaskを継承して作ります。
 

 
<Param, …>はジェネリクスな変数を意味しています。
 
変数型にはInteger型やString型などがあるのですが、それぞれのデータ型で同じように処理することが出来きるようにするためのものです、なのでここにはStringやIntegerなどを入れて使えます。
 
その変数は3つのメソッドに関連しています

  • doInBackground(Params…)
    • バックグラウンドでの非同期処理、何か重い処理を記述する
    • ここに渡されるパラメータの型は1つめのParams
  • onProgressUpdate(Progress…)
    • 途中経過をメインスレッドで表示する場合
    • doInBackground内でpublishProgressを設定するとメインスレッドから呼ばれ、パラメータの型は2つめのProgress
  • onPostExecute(Result)
    • バックグラウンドでの非同期処理が終了後メインスレッドに結果を返す
    • パラメータは3つめのResult

このクラスの非同期を実行させるためにはexecute(…)をメインスレッドから呼び出します。実際に使ってみましょう。

 

AsyncTaskの実装

 
非同期の他にinterfaceを使ってListenerを実装していますが、それは後半に出てきます。
 
MainActivity.java

 
非同期処理を行うクラスです。パラメータはintを使いたいのですが、ジェネリックに指定できるのは参照型のみで基本型のintは使えません。それでIntegerでラッパークラスを使用します。

TestTask.java

 
レイアウトです
activity_main.xml

 
リソースです
strings.xml

 

 

AsyncTaskのwarning

 
「This field leaks a context object …」
こんな warning でこのページを見つけたのであれば、ドンピシャです。
 
asynctask a01 - [Android] 非同期処理 AsyncTaskの使い方
 
非同期側からActivityやViewのインスタンスを参照するとリークするぞという警告です。非同期の作業が終わったらTextViewで結果を表示させようとした例です。
WeakReferenceにするという方法もありますが、どうもしっくり来ないと思っていたところ同じ気持ちの人を発見しました。
 
You don’t have to use WeakReference to avoid memory leaks
 
Novodaのエキスパートらしいのですが、WeakReferenceは最終手段でNovodaでは使っとらへんでーということらしいです。Listenerを使うのですが、至極理にかなっていますね。
 
非同期作業を別にやらせているので、メインスレッドからはいつ作業が終わるのかわかりません。毎回ポーリングするのは無駄が多いですし、作業が終わったら教えてくれればいいのです。それを聞く耳は立てておくということでしょう。
 
Listenerを独自に作成する方法はこちらを参照してください。

custom listener 00 100x100 - [Android] 非同期処理 AsyncTaskの使い方
カスタムでイベント変更・終了を独自のlistenerを使って通知させることができます。  

余談ですが、syncは同期という意味合いですが、asyncで言う「a」は接頭辞で「not」の意味を持ちます。リスニングでは聞き逃しそうですね。
 
 
関連ページ:

References:
GoogleのReference
ThreadPoolExecutor | Android Developers

誤字脱字、意味不明で分からにゃイ、
などのご意見はこちらから mailフォーム

ブックマークしておくと便利です このエントリーをはてなブックマークに追加




アプリ開発が上達するお勧め

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンラインのプログラミングスクールがいいでしょう、時間の制約がないところが一番の魅力です。

以下の3つはAndroidが学習できるオンラインスクールです。


TECH ACADEMY
Androidアプリコース



侍エンジニア塾
侍エンジニア塾 無料体験レッスン



CodeCamp
~約8,000名の受講生と80社以上の導入実績~
現役エンジニアのオンライン家庭教師CodeCamp





正直ネットや本では限界があります。直接(ネットで)誰か分かる人に聞いた方が早く解決して、上達も早いと思います。

尚、スクールがダメだと言う人がいますが、やる気があれば問題ありません。与えられるのを待っていてはいけないですね
欲しいものは取りに行くのです。


Google Pixel 3 XLグローバル版
SIMフリー 並行輸入品
6.3インチの大画面
背景をぼかすポートレートモード撮影


Anker PowerCore II Slim 10000
Power IQ 2.0搭載
iPhone & Android対応

シェアする

  • このエントリーをはてなブックマークに追加

フォローする