0

一般的なゲーム ループ プログラミング パターンと非常によく似た方法で無限ループを実行するスレッドがあります。スレッド ( と呼ばれる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() メソッドを呼び出して、のハンドラーを取得することもできます。しかし、いつこれらを呼び出す必要がありますか?AudioSchedulermParentHandlerAudioScheduler

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();
    }
  }
4

0 に答える 0