0

ビットマップに対して一連のメモリを大量に消費する操作を実行するAndroidアプリのデバッグで問題が発生しています。Googleのデバッグのヒントから、私はそれを知っています

デバッガーとガベージコレクターは現在、緩く統合されています。VMは、デバッガーが認識しているオブジェクトが、デバッガーが切断されるまでガベージコレクションされないことを保証します。これにより、デバッガーが接続されている間、時間の経過とともにオブジェクトが蓄積する可能性があります。たとえば、デバッガーが実行中のスレッドを検出した場合、スレッドが終了した後でも、関連付けられたThreadオブジェクトはガベージコレクションされません。

残念ながら、これは、私のアプリがリリースモードで正常に実行されている間、デバッグモードで実行されているメモリを大量に消費するスレッドはガベージコレクターによって無視され、保持されるため、メモリを大量に消費するスレッドが増えるにつれて、より多くのメモリが使用されることを意味します。作成され、必要なメモリの割り当てに失敗したため、アプリがクラッシュしました。

これらのスレッドを収集する必要があることをガベージコレクターに明示的に伝える方法、またはこの問題を回避する他の方法はありますか?

4

1 に答える 1

0

私は最終的に、AsyncTaskではなくをスポーンすることでこれを解決しましたThread。AsyncTasksはガベージコレクターによってより簡単にクリアされるようです。したがって、問題なくデバッグモードでアプリを実行できました。

AsyncTaskは、バックグラウンド操作を生成するための推奨される方法です。バックグラウンドで実行する作業はすべて、タスクのdoInBackground(Params...)メソッドに配置する必要があります。AsyncTasksは通常、完了後にUIスレッドでアクションを実行することを目的としていますが、onPostExecute(Result)メソッドを空のままにするか、存在しないようにするだけで、UIスレッドの邪魔を避けることができます。

于 2013-04-17T18:38:28.503 に答える