2011-01-03 7 views
20

私はしばらくこれに悩まされています。別のThread/AsyncTaskが実行されているときに、画面の向きの変更を正しく処理するにはどうすればよいですか?現在、私は私のAndroidManifest.xmlAsyncTasksが実行されているときにハンドルの向きが変わります

android:configChanges="orientation|keyboard|keyboardHidden" 

を持っているが、それはnot really encouragedです:

注:この属性を使用するには、唯一の最後の手段として回避して使用する必要があります。構成の変更により再起動を適切に処理する方法の詳細については、「実行時の変更の処理」を参照してください。

また、2.3エミュレータで、それはlandscapeへの切り替え時に動作しますが、portraitに戻って切り替えが失敗しました。

私がconfigChangesを使用する理由は、ユーザーが向きを変えたときに、ネットワークトラフィックを実行している可能性があります。

これを行う方法はありますか、2.3を固定してポートレートに戻す方法がありますか?

は、私は約onRetainNonConfigurationInstance知っているが、私はAsyncTaskを拡張するクラスは静的ではありません(それはActivityに結びついている)主な理由は、AsyncTaskインスタンスを「保存」することをお勧めだろうか分かりません - onPostExecute()の場合は、Activityインスタンスからメソッドを呼び出します。

答えて

7

AsyncTaskApplicationクラスから継承するクラスの一部として実装することで、同様の問題が発生し、回避できました。 Applicationクラスはアプリケーションの全ライフタイムで利用可能ですので、アプリケーション全体が強制終了されない限り、あなたのAsyncTaskが中断する心配はありません。

タスクが完了したときに通知を受けるには、Applicationクラスに自身を登録するために使用するインターフェイスを実装する必要があります。

画面が回転してアプリケーションが破棄された場合は、クラスからActivityを登録解除し、再作成時に再登録することができます。タスクが破棄と再作成との間に終了した場合、操作の結果はApplicationクラスに格納されますので、Activityは、タスクがまだ実行中かどうか、または再作成時に結果が既に利用可能かどうかを確認できます。

ApplicationクラスがContextクラスのサブクラスであるため、アプリケーションコンテキストに直接アクセスできます。

+0

'Service'を実装するよりもずっと簡単です。ありがとう。 – Felix

+0

@Flo私はこの記事が投稿されてからしばらくしていることを知っていますが、私は同じことをやろうとしていますが、あなたが何を意味するのかよく分かりません。 "タスクが終了したときに通知するには、 Applicationクラスに自身を登録するために使用します。例があれば? (私はjavaとandroid1の新機能です) – Bex

+0

申し訳ありませんが、コード例はありません。しかし、[オブザーバーパターン](http://stackoverflow.com/questions/2483644/rosetta-stone-observer-pattern)を見てください。あなたが「レジスタ」(update())と私が何を意味するのかを理解していただきたいと思います。 "通知"(addObserver())。 – Flo

0

私はすでに同様の質問hereをポップアップしました。

AsynTaskのデバイスの回転を一時停止/再開する方法は基本的にexampleです。しかし、それはすべての場合に適合していません(リモートサーバー上の新しいユーザー作成など、アクションを安全に中断できないことがあります)。それらの "安全でない"ケースでは、やや難しい "フレームワーク"と呼ばれるコードをいくらか作成する必要があります。 CommonsWareがgithubへのリンクを表示します。

+0

だから、 'Activity'が再起動している間、実行中の' AsyncTask'を維持する方法(簡単には)ありません。バマー。しかし、私は、設定アプリが同じことをするので、スイッチバックではなく、ポートレートに戻ることがエミュレータの問題であることを発見しました。 – Felix

関連する問題