欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android Handler內(nèi)存泄漏原因及解決方案

 更新時間:2021年02月18日 10:20:46   作者:OpenGL  
這篇文章主要介紹了Android Handler內(nèi)存泄漏原因及解決方案,幫助大家更好的理解和利用Android進(jìn)行開發(fā),感興趣的朋友可以了解下

目錄:

1.須知:

  1. 主線程Looper生命周期和Activity的生命周期一致。
  2. 非靜態(tài)內(nèi)部類,或者匿名內(nèi)部類。默認(rèn)持有外部類引用。

2.原因:

Handler造成內(nèi)存泄露的原因。非靜態(tài)內(nèi)部類,或者匿名內(nèi)部類。使得Handler默認(rèn)持有外部類的引用。在Activity銷毀時,由于Handler可能有未執(zhí)行完/正在執(zhí)行的Message。導(dǎo)致Handler持有Activity的引用。進(jìn)而導(dǎo)致GC無法回收Activity。

3.可能造成內(nèi)存泄漏

匿名內(nèi)部類:

  //匿名內(nèi)部類  
  Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
      super.handleMessage(msg);
    }
  };

非靜態(tài)內(nèi)部類:

  //非靜態(tài)內(nèi)部類
  protected class AppHandler extends Handler {

    @Override
    public void handleMessage(Message msg) {
      switch (msg.what) {
        // TODO: 2019/4/30 
      }
    }
  }

4.解決方法:

Activity銷毀時,清空Handler中,未執(zhí)行或正在執(zhí)行的Callback以及Message。

  // 清空消息隊列,移除對外部類的引用
  @Override
  protected void onDestroy() {
    super.onDestroy();
    mHandler.removeCallbacksAndMessages(null);

  }

 
  //Handler源碼中removeCallbacksAndMessages()注釋含義
  /**
   * Remove any pending posts of callbacks and sent messages whose
   * <var>obj</var> is <var>token</var>. If <var>token</var> is null,
   * all callbacks and messages will be removed.
   */
  public final void removeCallbacksAndMessages(Object token) {
    mQueue.removeCallbacksAndMessages(this, token);
  }

靜態(tài)內(nèi)部類+弱引用

  private static class AppHandler extends Handler {
    //弱引用,在垃圾回收時,被回收
    WeakReference<Activity> activity;

    AppHandler(Activity activity){
      this.activity=new WeakReference<Activity>(activity);
    }

    public void handleMessage(Message message){
      switch (message.what){
        //todo
      }
    }
  }

5. 其他:

即使內(nèi)存泄漏了。待handler中的消息處理完。下次GC時即可回收本次未回收的內(nèi)存。

以上就是Android Handler內(nèi)存泄漏原因及解決方案的詳細(xì)內(nèi)容,更多關(guān)于Android Handler內(nèi)存泄漏的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論