ActivityでのonStopおよびonDestroyメソッド遅延コールBUG解決
1747 ワード
ActivityでのonStopおよびonDestroyメソッド遅延コールBUG解決
今周の月曜日に机能开発が终わった后に、1つのとても奇抜な问题を発见して、私は1つのActivityを书いて、缲り返し中に入って退出して、このように20回缲り返して、TVのメモリは意外にも53 Mから惊くべき170 Mまで升って、メモリの漏洩の通常の方法のいくつかのステップを解决することを试みました:
(1)Activityを脱退したときにhandlerのMessageとRunnableを乾かす
if(getHander() != null){
getHander().removeCallbacksAndMessages(null);
}
(2)Activity context参照が不適切で終了した場合,Activity全体が回収できない.プログラムではできるだけ使います
ApplicationContext
(3)Listenerインタフェースコールバックが追加されていることを確認し、逆登録されていない
(4)List,HashMapなどの集合クラスは,終了時にclearが抜け,空にする.
(5)一例クラスでActivity Contextが参照されているか
以上の手順に従って、私が書いたコードですべて実践したことを確認した後.結局メモリは相変わらずで、そのために長い間悩んでいました.加えて、最近本を読んで火事になって、でたらめを考えて、最後に私は意外にもこのために3日間眠れませんでした.( ˇˍˇ )
その後、私はまたもっと奇妙な問題を発見しました.このページに入るとloadingをしていましたが、キャンセル要求はonDestroyでしか行われませんでした.その後、logを印刷してから、onStopとonDestoryメソッドはfinish Activityの7秒後に呼び出されたことに気づきました.やっと問題が見つかった.解決しよう
構想:onStopとonDestroyメソッドが特に時間のかかる操作を実行し、Activityのメソッドがブロックされたに違いない.
最終的にonDestroyメソッドで発見され、他のパートナーが追加した音声SDKを終了する方法について、私はこのメソッドを注釈します.
落ちて、それから再起動して、メモリの情況を見て、onDestroy方法が直ちに呼び出すことができることを発見して、しかし戻って退出して、結果
onDestroyメソッドは呼び出しを遅延します./(ㄒoㄒ)/~~
その後、音声SDKにはリストやmapのデータがたくさんあることに気づきました.また、いくつかのコールバックリスニングがありますが、これらのデータが乾いていないのではないでしょうか.そこで私は集合クラスと傍受をonDestroyメソッドで乾かし、最後に再コンパイルしました.
やはりこのActivityへの脱退と進入を繰り返し、メモリは常に60 M程度に保たれている.問題はやっと解決した...
音声を確認したSDKによると、Activityの起動はインタフェースに大きなHashMapオブジェクトを取得するように要求し、このオブジェクトを乾かしていないのに、毎回3-5 Mのメモリが増加していることが分かった.onDestroyのたびにネットワーク要求のリストデータを乾かす必要があることがわかる.
まとめ:onStopメソッドとonDestroyメソッドの遅延呼び出しは、音声のSDKメモリ漏洩によるものです.
if(getHander() != null){
getHander().removeCallbacksAndMessages(null);
}