Android InputMethodManager泄漏Activity
程序员文章站
2022-03-02 14:35:07
...
通过Android Profile+MAT定位到InputMethodManager泄漏Activity。
- 解决方案
import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import java.lang.reflect.Field;
/**
* 内存泄漏工具类
* 作者: FebMaple on 26/12/2018.
* 版权: FebMaple
* ====================================================
*/
public class MemoryLeakUtil {
/**
* fix InputMethodManager leak memory
*
* @param context
*/
public static void fixInputMethodMemoryLeak(Context context) {
if (context == null)
return;
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputMethodManager == null)
return;
String[] viewArr = new String[]{"mCurRootView", "mServedView", "mNextServedView", "mLastSrvView"};
Field field;
Object fieldObj;
for (String view : viewArr) {
try {
field = inputMethodManager.getClass().getDeclaredField(view);
if (!field.isAccessible()) {
field.setAccessible(true);
}
fieldObj = field.get(inputMethodManager);
if (fieldObj != null && fieldObj instanceof View) {
View fieldView = (View) fieldObj;
if (fieldView.getContext() == context) {// 被InputMethodManager持有引用的context是想要目标销毁的
field.set(inputMethodManager, null);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
在泄漏的activity ondestroy内添加
@Override
protected void onDestroy() {
MemoryLeakUtil.fixInputMethodMemoryLeak(this);
super.onDestroy();
}
上一篇: linux什么是编译
下一篇: 关键字super
推荐阅读
-
Android开发教程之Fragment定义、创建与使用方法详解【包含Activity通讯,事务执行等】
-
Android Activity切换动画详解及实例
-
Android 5.1 WebView内存泄漏问题及快速解决方法
-
Android 中启动自己另一个程序的activity如何实现
-
Android 启动另一个App/apk中的Activity实现代码
-
android弹出activity设置大小的方法
-
android游戏载入的activity跳转到游戏主菜单的activity具体实现
-
Android Studio 3.0上分析内存泄漏的原因
-
关于Android Activity之间传递数据的6种方式
-
Android中Activity滑动关闭的效果