如果关注的话内存泄露在开发中经常会遇到,因为这个泄露是我印象最深的,所以特别记录一下,希望对遇到的朋友有帮助!
刚开始我以为只是用到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);
}
}
到这里就可以完美的解决这个问题了,希望对你有帮助。