[解決済み] Android AsyncTaskによる長時間動作の実現
質問
AsyncTaskのドキュメントを引用すると、以下のようになります。 ここで と書いてあります。
AsyncTasksは理想的には短い操作(せいぜい数秒)のために使われるべきです。もしスレッドを長時間動かし続ける必要があるなら、Executor、ThreadPoolExecutor、FutureTaskといったjava.util.concurrentパッケージが提供する様々なAPIを使うことを強く推奨します。
ここで私の疑問が生じます。それは
doInBackground()
関数はUIスレッドから実行されるので、ここで長時間実行することで何か不都合があるのでしょうか?
どのように解決するのですか?
非常に良い質問ですね。Android プログラマとして、この問題を完全に理解するには時間がかかります。実際、AsyncTask には、関連する 2 つの主要な問題があります。
- アクティビティのライフ サイクルにうまく関連付けられていない
- メモリリークが発生しやすい
の内部には ロボスパイス モチベーションアプリ( Google Playで公開中 ) では、その質問に詳しくお答えします。AsyncTasks、Loader、それらの特徴や欠点について詳しく説明し、さらにネットワークリクエストの代替ソリューションである : RoboSpice ネットワークリクエストは Android では一般的な要件であり、その性質上、長時間実行される操作である。 . 以下はアプリからの抜粋です。
AsyncTask と Activity のライフサイクル
AsyncTaskはActivityインスタンスのライフサイクルに従わない。Activity内でAsyncTaskを起動し、デバイスを回転させると、Activityは破棄され、新しいインスタンスが作成されます。しかし、AsyncTaskは死なない。完了するまで生き続けるのです。
そして完了したとき、AsyncTaskは新しいActivityのUIを更新しません。実際、もう表示されていないアクティビティの以前のインスタンスが更新されます。 が表示されなくなります。これは、java.lang.IllegalArgumentException.View not attached to window manager というタイプの例外につながる可能性があります。ビューがウィンドウマネージャにアタッチされていない場合 を使用している場合、例えば、findViewByIdでアクティビティ内のビューを取得します。
メモリリークの問題
アクティビティの内部クラスとしてAsyncTasksを作成するのは非常に便利です。AsyncTask はタスクが完了または進行しているときに Activity のビューを操作する必要があるため、Activity の内部クラスを使用することは非常に便利です。 タスクが完了または進行中のとき、Activityの内部クラスを使用することは便利です:内部クラスは、外部クラスの任意のフィールドに直接アクセスできます。 内部クラスは外部クラスの任意のフィールドに直接アクセスすることができます。
とはいえ、これは内部クラスが外部クラスのインスタンスであるActivityの見えない参照を保持することを意味します。
AsyncTaskが長く続くと、アクティビティが生かされます。 一方、Android は、もはや表示できないので、それを取り除きたいと考えています。アクティビティはガベージコレクトされないので、これはAndroidがリソースを保存するための中心的なメカニズムです。 Android がデバイス上のリソースを維持するための中心的なメカニズムです。
AsyncTasksを長時間実行する操作に使用するのは、本当に非常に悪い考えです。しかし、1~2秒後にビューを更新するような短時間実行のものには問題ありません。
私はあなたが RoboSpice Motivationsアプリ このアプリは、このことを深く説明し、いくつかのバックグラウンド操作を行うためのさまざまな方法のサンプルとデモを提供しています。
関連
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] AsyncTaskのAndroidサンプル
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み] Android Debug Bridgeでアプリケーションのインストール時にINSTALL_FAILED_VERSION_DOWNGRADEを無視する方法はありますか?
-
[解決済み] 「KotlinとAndroidで「パラメータTを推測するのに十分な情報がありません。
-
[解決済み] 非ActivityクラスでContextを取得する [重複].
-
[解決済み] Androidアプリケーションのヒープサイズを大きくするには?
-
[解決済み] フラグメント間の値の受け渡し方法
-
[解決済み] PendingIntentの "requestCode "は何に使うのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] アンドロイドのAsynctaskとThreadの比較
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] Android - タイトルバーに戻るボタンが表示される
-
[解決済み] Androidのソースコードにある@hideの意味とは?
-
[解決済み] 通知をクリックした後にアプリケーションを開く
-
[解決済み] Android - Snackbar vs Toast - 使い方と違い。
-
[解決済み] アンドロイドでシェイクを検出するには?
-
[解決済み] EditTextをReadOnlyにする
-
[解決済み] edittextのテキストがメールアドレスかどうかを確認するには?
-
[解決済み] Android APKファイルの中身を見るには?