<HOME

非同期タスクでテキストファイルを読み込む30分


SDカード(または内蔵ストレージ)に保存されているテキストファイルを読み込んでTextViewに表示してみましょう。

  1. 「AsyncTaskTraining」アプリを作成します。

    1. Android Studioを起動し、新規プロジェクトを作成します。

      「Welcome to Android Studio」画面の場合は、「Start a new Android Studio project」をクリックします。

      別のプロジェクトが開いている場合は、ツールバーから「File」→「New」→「New Project...」をクリックします。

    2. HelloWorldの時と同じようにプロジェクトを作成していきます。

      アプリ名は「AsyncTaskTraining」としてください。

      今回は「Backwards Compatibility (AppCompat)」のチェックは外しておきます。

  2. adbコマンドで/sdcard/にテキストファイルをpushします。

    adb push <pushするファイルのパス> /sdcard/<ファイル名>

    adb push C:\Users\S\Downloads\sample\sample.txt /sdcard/sample.txt

    (PC等でSDカードにファイルを保存しても構いません。)

  3. /sdcard/のファイルを読み込んでTextViewに表示する処理を実装します。

    1. ファイル読込を行うメソッドを実装します。

      サンプル

      コードを表示するにはJavaScriptを有効にしてください

    2. onCreateでファイルを読み込んでTextViewにsetTextする処理を実装します。

      サンプル : activity_main.xml

      コードを表示するにはJavaScriptを有効にしてください

      サンプル : MainActivity.java

      コードを表示するにはJavaScriptを有効にしてください

    3. Manifestでの権限使用の宣言も忘れずに。

      サンプル : AndroidManifest.xml

      コードを表示するにはJavaScriptを有効にしてください

  4. アプリを起動して動作を確認してみましょう。

    表示はされますが、テキストファイルのサイズが大きいと、時間がかかります。

    もしかしたら、「応答していません」というメッセージが表示されるかもしれません。

  5. Androidアプリはマルチスレッドで動作しています。

    ファイル読み書きなど、時間がかかる可能性のある処理をメインスレッド(UIスレッド)で行うのは好ましくありません。

    UIの処理をブロックしてしまい、長時間画面操作できなくなったり、ANR(Application Not Responding)が発生したりします。

    非同期タスクのAPIを利用して、バックグラウンドスレッドでタスク実行を行うようにします。

    1. 「AsyncTask」APIを利用して、バックグラウンドで非同期タスクを実行します。

      ファイル読込を行っていた処理を以下のように変更してください。

      サンプル

      コードを表示するにはJavaScriptを有効にしてください

      AsyncTaskの<>内は左から「Param」「Progress」「Result」の型を示しています。

      今回はAsyncTaskの処理のINPUTとして引数に「/sdcard/sample.txt」のFileオブジェクトを、

      処理のOUTPUTとして実行結果に「ファイルから読み込んだテキスト」を指定したいので、

      Paramの型をFile、Resultの型をStringにしています。


      AsyncTaskの「execute」メソッドが実行されると、OSによりバックグラウンドスレッドが生成され、

      「doInBackground」メソッドがコールされます。

      ですので、バックグラウンドで実行したい処理は「doInBackground」メソッドをオーバーライドして実装します。


      AsyncTaskのバックグラウンド処理が完了すると、OSにより本来のスレッドで「onPostExecute」メソッドがコールされます。

      今回は、ファイル読込が終わったらTextViewの内容の変更を行いたいのですが、

      UIの変更はバックグラウンドスレッドでは実施できない(UIスレッドで実施されるべき処理です)ので、

      「onPostExecute」をオーバーライドしてUIスレッドでTextViewの内容の変更を実施するようにしています。

      サンプル : MainActivity.java

      コードを表示するにはJavaScriptを有効にしてください

  6. アプリを起動して動作を確認してみましょう。

  7. もう少しユーザーに親切にするなら、時間のかかる処理をバックグラウンドで実行している間、実行中であることを示すメッセージを表示するのが良いでしょう。

    (ユーザビリティの向上)

    1. 「ファイルを読み込んでいます…」ダイアログを作成します。

      サンプル : res/layout/progress.xml

      コードを表示するにはJavaScriptを有効にしてください

      サンプル : ProgressDialog.java

      コードを表示するにはJavaScriptを有効にしてください

    2. AsyncTaskのバックグラウンド処理実行前にダイアログを表示し、バックグラウンド処理実行後にダイアログを消去する処理を実装します。

      AsyncTaskのバックグラウンド処理実行前に、OSにより本来のスレッドでAsyncTaskの「onPreExecute」メソッドがコールされます。

      今回はこれを利用してみましょう。

      サンプル : MainActivity.java

      コードを表示するにはJavaScriptを有効にしてください

  8. アプリを起動して動作を確認してみましょう。

マルチスレッドプログラミングに関する詳細については公式ドキュメントに記載されています。

また、Androidは先人たちがネット上にたくさんの情報を残してくれています。

これらも活用して、是非このAPIを有効に使えるようになってください。