2

現在、Android (OpenGL ES 1.1) でゲームを開発しています。新しい SurfaceView (GLView) を作成するたびに、そのスレッドが作成されることがわかります。それで大丈夫です。問題は、SurfaceView を保持するアクティビティを終了したい (そしてメニューに戻りたい) ときに発生します。各GLThreadが参照しているため、アクティビティが解放されていないようです。これは、OOM エラーで終了する場合があります。

いくつかのマットの写真:

MarkitActivity は、SurfaceView を扱うアクティビティの各インスタンスを表します

メモリ内のすべてのアクティビティのリスト

GC からアクティビティを保持しているもの

最初の図: MarkitActivity は、SurfaceView を扱うアクティビティの各インスタンスを表します。

2 番目の図: メモリ内のすべてのアクティビティのリスト。

3 番目の写真: GC からアクティビティを保持しているもの。

コードが必要な場合は、投稿します。それにもかかわらず、私はすでに次のことを試しました:

->レンダラーとサーフェス ビューへのアクティビティ コンテキストの弱い参照。

->アクティビティ コンテキストの代わりにアプリケーション コンテキスト (ノーマル モードとウィーク モード)。

->スレッドを(難しい方法で)停止しようとして(割り込み)、結合を待機しています(プログラムはそれを行いますが、スレッドは気にしません。まだそこにあります...)

->デバッガモードで値が変わる場合に備えて、デバッグなしで試しています(MATの写真はデバッガなしです)。

->Activity を singleInstance モードで試しています。どこでも奇妙な結果とエラー。

->onPause と onResume がビューに対して正しく制御されます。

ヒント、アイデア、質問、またはヘルプをいただければ幸いです。前もって感謝します!

カルロス。

4

1 に答える 1

0

私はスレッドで同様の問題を抱えていましたが(OpenGLは使用していません)、単純なトリックを使用して問題を解決することになりました。

アクティビティを終了する前に(onPause()またはonStop()で、次のようにスレッドをnullにしてみてください:

myThread = null;

GCが収集可能になっているようですThreadので、あなたの活動も収集可能になります。

それは私にとっても、私が同じ提案をした同様の問題を抱えている何人かの人々にとってもうまくいきました。

よろしく。

于 2012-11-13T22:14:42.890 に答える