一般的なゲーム ループ プログラミング パターンと非常によく似た方法で無限ループを実行するスレッドがあります。スレッド ( と呼ばれるAudioScheduler
)は、MainActivity
ハンドラを介して通信します。MainActivity
実行中の構成変更の破棄と再作成に対処するために、アプリを取得する必要がありますAudioScheduler
。
これには多くの方法があります。現在推奨されている最良の方法は、API デモに示されているように、またAlex Lockwood の優れた記事で説明されているように、保持フラグメント アプローチを使用することです。
彼の例では、インターフェースを使用しAsyncTask
て、彼から彼への一方通行の通信を効果的に行ってMainActivity
います。私の状況では、UI の変更を AudioScheduler スレッドに伝えるために MainActivity が必要です。また、AudioScheduler スレッドが MainActivity に通信して、UI を更新するように伝えることもできます。
これを達成するためにハンドラーを使用しましたが、それが最善の方法であり、構成変更への Retained Fragment アプローチで機能しますか?
私の現在のコミュニケーション方法
私のAudioScheduler
スレッドにはあります。
- ハンドラを作成しました
audioSchedulerHandler
MainActivity がアクセスできるように getter メソッドを作成しました。
public Handler getHandler() {return audioSchedulerHandler;}
通信に使用できる親アクティビティからハンドラーを取得するコンストラクターを使用しました。
public AudioScheduler(Handler parentHandler) {mParentHandler = parentHandler;}
私MainActivity
は持っています。
- ハンドラを作成しました
mainHandler
- のインスタンスを作成するときにこれをコンストラクターに渡しました
AudioScheduler
- インスタンスで私の
getHandler()
メソッドを使用して、AudioScheduler
通信できるようにしました。
この双方向通信MainActivity
が破壊され、再作成された場合はいつでも再確立する必要があります。これはどのように行うべきですか?
クラスにメソッドsetParentHandler(Handler parentHandler)
を追加して、スレッド オブジェクトが既に作成された後でも再割り当てできるようにすることができます。新しく作成された MainActivity は、毎回 getHandler() メソッドを呼び出して、のハンドラーを取得することもできます。しかし、いつこれらを呼び出す必要がありますか?AudioScheduler
mParentHandler
AudioScheduler
Alex Lockwood の例を変更MainActivity
すると、以下に示すように onCreate をオーバーライドしますが、これにより問題が発生しますか?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
FragmentManager fm = getFragmentManager();
mTaskFragment = (TaskFragment) fm.findFragmentByTag("audioSchedulerTask");
if (mTaskFragment != null) {
// Fragment is non-null, so it has been retained across a configuration change.
// TODO: Use the getHandler() and setParentHandler() methods to re-establish communication.
} else {
// Fragment is null, so make a new one.
mTaskFragment = new TaskFragment();
fm.beginTransaction().add(mTaskFragment, "task").commit();
}
}