美文网首页
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