2016-04-01 8 views
1

私のアプリは、私はそれがバックグラウンドで実行したまま、その後、画面上のアプリを持つに戻ったときにクラッシュし。私はそれがonResume()で実行されている私のAsyncTaskと関係があると信じています。このanswerのコメントの1つに、「アクティビティのインスタンスのトレースを保持し、非同期タスクがnullでないことを待たせる」と言う人がいます。だから、それがヌルでなくなるまで、それをどのくらい正確に待つのですか?)(getActivityを呼び出すAsyncTask内で安全に

そして一般的には、あなたが活動/フラグメントのライフサイクルの変更時に動作しますフラグメント内で実行されているAsyncTaskを持っていたときに活動を参照するための最も安全な方法は何ですか?

+0

パス活動。 – dex

+0

@dexので、AsyncTaskでgetActivity()を呼び出さずに、AsyncTaskへのアクティビティの参照を渡すことを意味していますか?これにより、自動的にアクティビティがガベージコレクションされなくなります。 –

+0

AsyncTaskを使用しないでください。代わりにローダーを使用します(AsyncTaskLoaderは適切な開始点です)。これは、構成の変更を適切に処理するように設計されています。 – kcoppock

答えて

1

まず、あなたは上でフラグメントがフラグメントの作成およびmActivityグローバル変数を作成することを含む活動で()getactivityを型キャストすることができます。

MainActivity mActivity = (MainActivity)getActivity(); 

あなたはAsynctaskで、さらにその変数を使用することができ、さらに活動が完成しましたかどうかを確認することができます(nullをチェックしません)

mActivity.isFinished(); 
-1

これはお勧めしません。 AsyncTask内でアクティビティにアクセスする必要がある場合は、インターフェイスを作成し、アクティビティでこのインターフェイスを実装し、アクティビティインスタンスをAsyncTaskコンストラクタに渡すことをお勧めします。 AsyncTaskには、インターフェイスタイプのプロパティが必要です。だから、あなたは

+0

それでもタスクはアクティビティへの参照を保持しているので、メモリリークの危険があります。 – kcoppock

0

背景やバックスタックにある間に実行されている(あるいは、既存の)Activityに頼ることはありません。このインタフェースにより活動に実装されているメソッドを呼び出すことができます。 FragmentAsyncTaskを入れておくと、タスクの設定変更(デバイスのローテーションなど)全体でタスクを実行し、アクティビティがバックグラウンドにある場合は維持することができます。バックグラウンドで実行し続けるものは、Serviceに属します。それはあなたの非同期タスクが完了しますしない限り、あなたの活動はゴミがそれまでは収集されません、このシナリオでは、asynctaskする

+0

私はバックグラウンドスレッドで継続的に実行されるものは何も実行していないので、サービスを使用することは私の懸念事項ではありません。 'onResume()'が呼び出されたときに、フラグメントに表示されているデータを更新したいので、ユーザーがアプリケーションに戻ったときに、最新のデータが読み込まれます。このデータは、AsyncTaskによって取得されます。それは保持されたフラグメント内に含まれていますが、私はまた、ホスティングアクティビティにあるデータを取得する必要があります、なぜ私はAsynctTaskでgetActivity()を使用しています。 –

関連する問題