2012-01-27 8 views
2

オンライン取引のデータを収集する活動があります。コレクションが終了すると、Webサービスを呼び出してその応答を待ってからバックグラウンドスレッド(具体的にはAsyncTask)を実行し、それをアクティビティに返します。一方、進捗ダイアログが表示されます。Androidのバックグラウンドスレッドの管理とアクティビティのライフサイクル

アプリケーションが終了した場合やユーザーがキャンセルしても(ただし、まだWebサービスに通知する必要がある場合)、バックグラウンドプロセスをキャンセルして、コンフィグレーションの変更によってアクティビティが破棄された場合は、またはメモリ。私はonRetainNonConfigurationInstance()を使用して、AsyncTaskからアクティビティを切り離し、保持し、次のアクティビティに再接続することを理解しています。すでにインフラストラクチャがあります。ライフサイクルコールバックの中には、アプリケーションが正常にシャットダウンしているかどうかを調べるisFinishingメソッドがあります。私は、進行ダイアログのコールバックでユーザーのキャンセルを処理することもできると信じています。

私は2つの簡単な質問している:私の活動は がメモリ不足のため死亡した場合には()を

  1. ウィルonRetainNonConfigurationInstanceと呼ばれますか? (原因が の設定変更の場合は、それがわかります)

  2. onStop()とonDestroy()が呼び出されない状況はどこですか(開発者ガイドで強調されていますか? (私は、キャンセルを扱う私の のコードは常に実行するかどうかを知りたい。)

すべてのすべてで、私は確認することができますonRetainNonConfigurationInstance()とisFinishingとonDestroy()を()実装することにより、すべての中で、確認されていること状況、私のバックグラウンドスレッドはそれに応じて処理されますか?

BONUS質問:何らかの理由でアプリケーションが強制終了された場合(永久に言えば)、AsyncTaskが応答を保存する方法を提供するにはどうすればよいですか?共有プリファレンスのインスタンスを保持し、それにデータを書き込むことはできますか?

答えて

3

私のアクティビティがメモリ不足のために殺された場合、onRetainNonConfigurationInstance()が呼び出されますか?

いいえ。あなたのアクティビティは、メモリ不足のために個別に殺されることはありません。メモリが不足しているためプロセス全体が終了することがありますが、onRetainNonConfigurationInstance()はインプロセスでの使用のみに設計されています。

onStop()とonDestroy()が呼び出されない状況(開発者ガイドで強調されている)は何ですか?

あなたのプロセスは、(onStop()はまだと呼ばれる可能性が非常に高いですが、Androidは、このような電話の着信が原因として、急いでいる場合onDestroy()はないかもしれません)メモリ不足の条件に終了することができます。また、処理されない例外が発生してアプリがクラッシュする可能性があります。ユーザーが強制停止した場合にonDestroy()が呼び出されたかどうかはわかりませんが、私はそれを疑っています。すべてのすべてで

、私はそのonRetainNonConfigurationInstanceを実装することで()を確認することができますし、isFinishingとonDestroy()()をチェック、あらゆる状況で、私のバックグラウンドスレッドはそれに応じて処理されますか?

"Every"は強い単語です。 Androidがプロセスを終了させると、あなたのスレッドも消えてしまいます。

私のアプリケーションが何らかの理由で抹消された場合(永久に言えば)、AsyncTaskで応答を保存する方法をどうすればできますか?

何か他の処理を行う前にデータをディスクに書き込んでください。その時点までに死に至らないことを願ってください。次に、次に実行すると、この保存されたデータが浮遊していることに気づき、残りの作業を手配します。

+0

タクス、私はあなたが答えてくれることを願っていました!だから私は、メモリが足りなくてプロセスが終了したときにisCancelled()が検出されたときに別のWebサービス呼び出しを行う機会はなく、データを書き込むのに十分な時間があることを願っています(まだ、それとも破壊されているのでアドバイスもされていませんか?) finishを呼び出す前にバックグラウンドスレッドを取り消すことができ、onReatinNonConfigurationInstance()は設定の変更を処理するのに十分です。 – Vincent

+0

@Vincent:「これに共通の設定を使用することはできますか?それとも破壊されているのでアドバイスしていませんか?」 - SharedPreferencesの値は、アプリケーションがアンインストールされるまで「破棄」されません。つまり、SharedPreferencesは、他の種類のファイルを使用する場合よりも漸進的に優れています。あなたが他のもののためにデータベースを使用しているなら、私はそこにあなたの情報を格納することを検討したいと思います。 – CommonsWare

+0

私は記憶装置を意味しませんでしたが、オブジェクトを書くために使用する必要があります。私が推測できる限り、それは現在のアプリケーションにリンクされています。ごくわずかな量の一時的なデータしか保存されていないので、私はまだデータベースを使用していません。しかし、私はその考えを考えてみます、トランスアクショナリティーはかなり良いと思います。あなたの答えをありがとう! – Vincent

関連する問題