3

こんにちは。

私はアンドロイドのアクティビティライフサイクルに慣れておらず、可能な限り読んでいますが、次のことをうまく解決する方法がわかりません。

GLSurfaceView を使用して、画面にさまざまなものを描画するアクティビティがあります。この GLSurfaceView のレンダリング スレッドでは、すべてのレンダリングと実際の更新ロジックを実行します (これは最終的に分離します)。

私が抱えている問題は、レンダラー内に描画された「画面」の 1 つからのもので、アクティビティを終了してさまざまなライフサイクル メソッドを呼び出したいと考えています。

通常、私は System.exit(0); でこれを行うかもしれません。ただし、この方法でアクティビティを終了しても、OnStop(); は呼び出されないようです。OnDestroy(); メソッド。

これは私が愚かで、これを行う簡単な方法を見ていないだけかもしれませんが、Activity にアクセスして activity.finish(); を呼び出す方法はありますか? それへの参照をずっと下に渡す必要はありませんか?

これはおそらくAndroidの質問ではなく、一般的なJavaの問題ですか? 申し訳ありませんが、私は両方で少し錆びています。たぶん、誰かがアプリでこのような問題をどのように処理するかを大まかに説明できれば.

4

3 に答える 3

5

スレッド セーフティ ルールに従う必要があり、レンダー スレッドから直接 activity.finish() を呼び出さないでください。これを処理する最善の方法は、ランナブルを UI スレッドのイベント キューにポストすることです。Runnable が activity.finish() を呼び出すようにします。

アクティビティを停止する予定のエリアにアクティビティを渡す必要はありません。これが私がすることです。onCreate() でインスタンス化するクラスにアクティビティを渡します。何かのようなもの:

public void onCreate( ... ) {
   MyRenderer renderer = new MyRenderer( glSurface, this );
}

次に、MyRenderer 内で次のようにします。

public void someMethodInRenderer() {
   if( stop ) {
      stop();
   }
}

public void stop() {
   Handler handler = new Handler();
   handler.post( new Runnable() {
      public void run() {
         activity.finish();
      }
   } );
}

UI スレッドにポストバックするために使用される Handler に注意してください。これにより、 activity.finish() を安全に呼び出すことができます。別のスレッドからfinish()を呼び出すのが安全か安全でないかを示す特定の情報がドキュメントに見つかりませんでしたので、安全のために投稿してください。

心に留めておくべきこと。someMethodInRenderer() がプログラムの奥深くにある場合、アクティビティ インスタンスに直接アクセスする必要はありません。参照が必要なだけなので、最終的にアクティビティを呼び出して終了する何かが必要です。そのため、stop() を追加できるそのメソッドに渡すシステムの別の部分への参照がある可能性があります。したがって、stop() と someMethodInRenderer() は同じクラスまたは異なるクラスにある可能性があります。それはあなたがしなければならない選択です。最終的に、これはあなたが決定しなければならないアーキテクチャの問題です。

于 2010-11-29T15:22:55.363 に答える
1

レンダラー スレッドがアクティビティ内にある場合は、ActivityClassName.this.finish(); を使用できます。

于 2010-11-29T15:18:34.380 に答える