Handlerメモリの漏洩と解決方法

2252 ワード

  • Handlerによるメモリの漏洩および解決策
  • AndroidでHandlerを使用するとメモリが漏れる原因
  • 解決方法
  • 弱引用紹介


  • Handlerによるメモリの漏洩および解決策
  • javaには独自のGCメカニズムがあり、
  • GCが1つまたは複数のオブジェクトが到達不可能であることを発見した場合、そのオブジェクトはメモリから回収され、
  • .
  • オブジェクトのセットに相互参照のみが含まれ、外部からの参照がない場合、これは到達不可能であり、GCによって回収されます.


  • AndroidでHandlerを使用してメモリが漏れる原因
  • HandlerはAndroidの内部クラスで、一般的にActivityに書かれていますが、内部クラスは外部クラスの参照を持っているため、Activityが破棄された場合、Handlerの中にスレッドが開いて時間のかかる操作をしていると、HandlerのせいでActivityが回収できなくなります.スレッドが仕事を終えるまで.
  • HandlerのpostDelayed()メソッドが実行された場合、このメソッドはHandlerをMessageにロードし、MessageをMessage Queueにプッシュすると、メッセージの処理が完了する前に、Message Que->ue->Message->Handler->Acticityのチェーンが参照チェーンとなり、Activityが保持され回収できなくなります.

  • 解決策
  • プログラムロジックによる保護
  • Activityを閉じるときにスレッドを停止し、停止スレッドはHandlerと外部の接続線を切断し、Activityは当然適切な時に
  • を回収する.
  • HanlerがMessaeによって参照されている場合、対応するHandlerのremoveCallback()メソッドを使用してメッセージ・キューからメッセージ・オブジェクトを除去すればよい.

  • Handlerを静的クラス
                 ,  Activity       。
      !  Handler            ,         Handler   Activity     。
        : Handler      Activity    (WeakReference)
    
  • と宣言する
    static class MyHandler extends Handler {
            WeakReference mActivityReference;
    
            MyHandler(Activity activity) {
                mActivityReference= new WeakReference(activity);
            }
    
            @Override
            public void handleMessage(Message msg) {
                final Activity activity = mActivityReference.get();
                    if (activity != null) {
                        mImageView.setImageBitmap(mBitmap);
                        }
                    }
                }

    上記のコードについては,Activityが破棄されるとHandlerの弱い参照指向があってもGCによって回収される.
    弱引用の紹介
  • WeakReference弱引用は、強引用とは対照的に、GCが弱引用を無視して回収しているのが特徴です.
  • 弱引用指向のオブジェクトは、そのオブジェクトが強引用指向されていない限り、そのオブジェクトはGCにチェックされて回収される.

  • 引用についてもっと多くのものについては各引用の違いに進んでください