1

Activity.onRetainNonConfigurationInstance() を使用してアクティビティの 1 つのインスタンスによって開始されたバックグラウンド スレッドを維持し、それをアクティビティの次のインスタンスに渡すことに関連するスタック オーバーフローに関する議論をここでいくつか見ました。縦向きから横向きまで。

この議論では、onRetainNonConfigurationInstance() から返されたオブジェクトにラップされたスレッドで何ができるかを正確に指定していません。

例: 1. この手法を使用してバックグラウンド スレッドを実際に実行し続ける方法はありますか? 2. アクティビティの前のインスタンスがなくなったときにスレッドを何らかの方法で一時停止し、新しいインスタンスで再び再開する必要がありますか?

誰でも簡単な例を提供できますか?

詳細をいただければ幸いです。

4

2 に答える 2

2

何でも返すことができますonRetainNonConfigurationInstance()。Activity のあるインスタンスから別のインスタンスに渡す Thread がある場合は、それを直接返すか、または から返す別のオブジェクト内に置くことができますonRetainNonConfigurationInstance()。スレッドを一時停止したり、スレッドとやり取りしたりする必要はありません。何事もなかったかのように走り続けます。

気にする必要があるのは、スレッドがアクティビティとどのように相互作用するかだけです (存在する場合)。スレッドが (進行状況などを示すために) アクティビティをコールバックする場合、古いアクティビティは無効になるため、何らかの方法でスレッドに新しいアクティビティへの参照を与える必要があります。

バックグラウンド スレッドで何をしたいですか?

編集(スレッド/アクティビティに関する詳細を追加):

スレッドには、アクティビティから完全に切り離された独自のライフタイムがあります。アクティビティでスレッドを作成して開始すると、アクティビティが何を実行しても完了するまで実行されます。スレッドを明示的に停止する唯一のことは、Android がプロセスを強制終了することを決定した場合です (プロセスにアクティブなアクティビティが含まれていない場合に実行される可能性があります)。

于 2012-06-01T15:26:32.050 に答える
0

スレッドは引き続き実行されます。これで何ができるかの例については、android IgnitionプロジェクトとそのIgnitedAsyncTask(および関連する例) を確認してください。

アイデアは、スレッド (通常はAsyncTask) への参照を のどこかに維持し、場合によってはActivity、スレッド (特に の場合) が、結論時に何らかの UI 更新を実行するために へAsyncTaskの参照を必要とすることです。Contextそのバックグラウンド タスクの。スレッドが参照を持っているContext(およびそれから派生したもの -- aなど) が null でないことを確認する必要があります。そうしないとクラッシュします。TextView

You might use getLastNonConfigurationInstance() to set your Activity's reference to the thread, and then call a setter on the thread to set its Context reference (to avoid any related null pointer crash).

于 2012-06-01T15:32:19.467 に答える