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

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

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

目錄:

1.須知:

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

2.原因:

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

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

匿名內(nèi)部類(lèi):

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

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

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

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

4.解決方法:

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

  // 清空消息隊(duì)列,移除對(duì)外部類(lèi)的引用
  @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)部類(lèi)+弱引用

  private static class AppHandler extends Handler {
    //弱引用,在垃圾回收時(shí),被回收
    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時(shí)即可回收本次未回收的內(nèi)存。

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

相關(guān)文章

最新評(píng)論