2011-06-18 11 views
4

アンドロイドアプリケーションを開発する際に、プログレスバーを含むアクティビティを作成しました。 アクティビティの進行状況バーを更新する非同期タスクがあります。画面の向きが変更された後も、非同期タスクがまだ進行中であれば、進行状況バーは更新されません。非同期タスクは、画面の向きを変更した後にアンドロイドがonCreateメソッドを呼び出すときに作成された新しいプログレスバーインスタンスを参照していないと考えられます。画面の向きを変更してもAndroidのプログレスバーが更新されない

誰でも私にこれのためのヒントを表示することができれば感謝します。

ありがとうございました。代わりに、直接、プログレスバーを参照のasynctaskから

+0

あなたはおそらく、あなたの姿勢変更後の古い参照を与え、1回)(findViewByIdを呼び出していますか? – mah

+0

>非同期タスクが新しいプログレスバーインスタンスを参照していないと思います。これをすべて手動で行う必要があります。 –

+0

あなたは、回答を受け入れるか、投票することになっています。 –

答えて

4

あなたの正しいあなたAsyncTaskは、活動の新しいインスタンスを知りません。

しかし、あなたは新しい活動にAsyncTaskを渡すために使用することができ向きの変更とどの呼び出されるメソッドがあります。アクティビティが破壊される前に

onRetainNonConfigurationInstance()は、メソッドをオーバーライドして、実行中のAsyncTaskの参照を返し、呼び出されます。 onCreate()メソッド内で、getLastNonConfigurationInstance()の呼び出しのためにAsyncTaskを取得できます。初めてアクティビティーが作成され、getLastNonConfigurationInstance()がnullを戻すケースを処理する必要があることに注意してください。

さらに、アクティビティをAsyncTaskに渡す必要があるため、現在のアクティビティの進行状況を参照できます。したがって、AsyncTaskとの間でアクティビティを登録または登録解除する2つのメソッドを実装することをお勧めします。そのため、onRetainNonConfigurationInstance()では、破棄される「古い」アクティビティの登録を解除し、onCreateで新しく作成したアクティビティを新しいAsyncTaskまたはgetLastNonConfigurationInstance()から取得するアクティビティに登録します。

+0

@SuperStubbsによって提供された新しい情報を反映するために、この問題を解決する信頼できる方法ではないという事実に関して、あなたの答えを更新することができます。 –

0

は多分、あなたは活動の方法の中にプログレスバーを更新することができます。例えば。

活動の
onPublishProgress(int progress) { 
    updateProgressBar(progress); 
} 

updateProgressBar(int progress) { 
    progressBar.setProgress(progress); 
} 

それはonSaveInstanceState()をオーバーライドすることにより破壊される前に、活動の状態を保存することができます。 ここに進捗整数を保存してからonCreateに保存します。 savedInstanceStateがnullでないかどうかを確認し、保存された整数に設定されたプログレスバーを作成します。活動が破壊され、姿勢変更時に再作成されたよう

1

私はこれが古いと物事が変わったかもしれないが、フロの答えは受け入れられてはいけないと知っています。ここではドキュメントごと:onRetainNonConfigurationInstance()

「この機能は、純粋に最適化として呼ばれ、あなたはそれが呼び出されているに依存してはなりません。」

つまり、何か重要なことを実行していて、アクティビティが破棄されたときに「もの」が発生しなければならない場合、これは悪い解決策です。

よりよい解決策はここにありonSaveInstanceState(Bundle outState)を使用することです:onSaveInstanceState (Bundle outState)

関連する問題