美文网首页
InputMethodManager内存泄露终极解决方案

InputMethodManager内存泄露终极解决方案

作者: 独立黄昏 | 来源:发表于2018-01-14 15:57 被阅读1328次

    如果关注的话内存泄露在开发中经常会遇到,因为这个泄露是我印象最深的,所以特别记录一下,希望对遇到的朋友有帮助!
    刚开始我以为只是用到EditText的界面才会有这个泄露,没想到几乎每个activity都有这个问题,我用的是LeakCanary检测泄露,没解决之前没过多久就满屏的内存泄露,都是这个InputMethodManager导致的。
    然后我就去百度了一下,看到下面这个外国大神的这篇文章。
    https://medium.com/@amitshekhar/android-memory-leaks-inputmethodmanager-solved-a6f2fe1d1348
    他说这个是安卓源码的bug,解决方案是在泄露的activity销毁的时候开启一个过渡activity,然后500毫秒后关闭这个activity。先看下具体代码:
    package com.memory.test;
    import android.os.Bundle;
    import android.os.Handler;
    import android.support.annotation.Nullable;
    import android.support.v7.app.AppCompatActivity;
    /**

    • Created by amitshekhar on 06/05/16.
      */
      public class DummyActivity extends AppCompatActivity{
      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      new Handler().postDelayed(new Runnable() {
      @Override
      public void run() {
      finish();
      }
      }, 500);
      }
      }

    再给这个activity设置透明的主题:
    <resources>

    <style name="AppTheme.Transparent" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
    </style>
    </resources>
    我试过这样还是会有泄露的,所以再看其他的文章,有人提到说把这个过渡activity放到其他进程中,销毁的时候就kill掉这个进程,我试过之后这个泄露的问题就没有再出现过了。看下修改后的代码:
    package com.memory.test;
    import android.os.Bundle;
    import android.os.Handler;
    import android.support.annotation.Nullable;
    import android.support.v7.app.AppCompatActivity;
    /**

    • Created by amitshekhar on 06/05/16.
      */
      public class DummyActivity extends AppCompatActivity{
      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      new Handler().postDelayed(new Runnable() {
      @Override
      public void run() {
      finish();
      android.os.Process.killProcess(android.os.Process.myPid()) ;
      }
      }, 500);
      }
      }
      到这里就可以完美的解决这个问题了,希望对你有帮助。

    相关文章

      网友评论

          本文标题:InputMethodManager内存泄露终极解决方案

          本文链接:https://www.haomeiwen.com/subject/lpikoxtx.html