まとめAsyncTaskについて思うことAndroidアプリ開発が、一般に広く普及してから「約10年」ほどが経ちました。数々のリファレンスが生まれては、内容が古いまま残されている記事が散見されるようになってきました。APIレベル3以降から使われている非同期処理を担当するクラスの代表で、2019年6月段階では特別にgradleファイルを編集して別途ライブラリを追加する必要がないため、「下手にアプリサイズを増やさず、簡単に実装しやすい」という印象を持ちます。Componentsに提唱されるLiveData、最近正式採用化されたcoroutinesに取って代わることも多いようです。古くから存在するようなActivityやFragmentには、未だに存在し、かつ、昔のノウハウのまま実装されてしまっているものを時折現場で見かけます。ここでは、筆者が個人的に開発・リリース・運用を続けているTwitterクライアントを例に、AsyncTaskについて再考していきます。Studioで開いた場合、下記のような警告が出ていることがあります。false}}task.execute()}このように、AsyncTaskを匿名クラスとして利用し、なおかつ内部でUIに対する変更を加えている場合に起こります。この場合、Fragment(あるいはActivity)が破棄されしまっても、AsyncTaskが生き残ってしまった場合に、UI部品(ここではSwipeRefreshLayout)への参照が残ったままとなり、メモリリークを起こす可能性があります。非同期タスクは、あくまでも裏側で実行されていて、処理の完了には時間がかかることが想定されています。処理が完了する前にUIコンポーネントが不要になり破棄する必要がある状況になると、本来はUIオブジェクトを破棄するべきところなのに非同期タスクが参照を握っているために破棄されない...といった事が起こります。UIリソースが解放できなくなります。←ここが重要!RefreshCallBackインターフェイスを準備するAPIの取得・更新処理などが終わった時にUI側に結果を返す時に用いるコードの修正まず、AsyncTaskをディレクトリごと切ります。Package今回は、そのパッケージ名を「asynctask」とします。File/Classを選択(Javaで開発されている方は以下より.javaに置き換えてください)たとえば、ホーム・タイムラインを取得するためのクラスであれば「GetHomeTimeLineAsyncTask」と命名して保存。listOf()}}AsyncTaskの継承は、doInBackgroundメソッドさえ継承していればOKです。WeakReference(refreshCallback)RefreshCallBack、これはインターフェイス(interface)として作ります。このJavaが、最初から持つWeakReferenceが重要です。List<twitter4j.Status>?)}twitter4jを利用しているので、twitter4jをデータモデルと捉えてください。このRefreshCallBackを利用してFragmentへ参照を返します。this).execute()}}あとは、呼び出し元となるTimeLineFragmentにてRefreshCallbackインターフェイスの下記3メソッドを経由して、UIの更新処理などを行います。ProgressBar.VISIBLEreloadTimeLine()}※onRefreshメソッドに関してはSwipeRefreshを使う上で実装しています。WeakReferenceを経由して参照を渡すことで、非同期タスクがUIリソースの解放を遮らないようにします。}}}}AsyncTaskでよく使うメソッド個人的にAsyncTaskでよく使うメソッドは上記で書いたdoInBackground(必須の継承メソッド)onPostExecute(オプショナルだがよく使うメソッド)onProgressUpdate(オプショナルだがよく使うメソッド2)となります。onProgressUpdateに関してはアプリのユーザーにデータの読み込み情報を表示するProgressBarなどの表示のためによく使います。onProgressUpdateメソッドは、doInBackgroundメソッドでpublishProgressメソッドを呼ぶ必要がある点も注意しましょう。介して、UIの処理を行えば良いこれらの対応により、メモリリークの危険性は低減され、見通しの良いコードが出来上がるはずです。Studioからの警告もこのようにして撲滅できました。社長と一杯飲みながらお話してみたい方はこちらミツオカフリーランスエンジニア様の募集はこちらにゃんこ師匠その他、お問い合わせはこちらミツオカお気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね!一緒に働いてくれる仲間を募集しております!ライトコードでは、仲間を募集しております!当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。「好きなことを仕事にするエンジニア集団」の(株)ライトコードのメディア編集部が書いている記事です。rightcodeエンジニア大募集中!私たちライトコードでは、エンジニアを募集しております。私服大歓迎のカジュアルな職場なので、お気軽にご応募ください!また、フリーエンジニアの方も募集しております。