内存泄漏问题检测使用 LeakCanary
多线程操作造成的内存泄漏以及崩溃问题(RxJava2为例)
首先配置BaseActivity
public List<Disposable> disposableList=new ArrayList<>();
@Override
protected void onPause() {
super.onPause();
//在Activity执行onPause的时候取消所有订阅
if (disposableList.size()>0){
for (int i=0;i<disposableList.size();i++){
if (disposableList.get(i)!=null) {
if (!disposableList.get(i).isDisposed()) {
disposableList.get(i).dispose();
}
}
}
}
}
然后在Activity页面添加你的逻辑所订阅的所有Observer
....subscribe(new Observer<RequestResult>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
//记录订阅
disposableList.add(d);
}
@Override
public void onNext(@NonNull RequestResult result) {
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
Fragment的设置参照BaseActivity的方式
InputMethodManager(输入法)造成的内存泄漏问题
首先你需要一个方法解决这个内存泄漏
public static void fixInputMethodManagerLeak(Context destContext) {
if (destContext == null) {
return;
}
InputMethodManager imm = (InputMethodManager) destContext.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm == null) {
return;
}
String [] arr = new String[]{"mCurRootView", "mServedView", "mNextServedView"};
Field f = null;
Object obj_get = null;
for (int i = 0;i < arr.length;i ++) {
String param = arr[i];
try{
f = imm.getClass().getDeclaredField(param);
if (f.isAccessible() == false) {
f.setAccessible(true);
} // author: sodino mail:sodino@qq.com
obj_get = f.get(imm);
if (obj_get != null && obj_get instanceof View) {
View v_get = (View) obj_get;
if (v_get.getContext() == destContext) {
// 被InputMethodManager持有引用的context是想要目标销毁的
f.set(imm, null);
// 置空,破坏掉path to gc节点
} else {
// 不是想要目标销毁的,即为又进了另一层界面了,不要处理,避免影响原逻辑,也就不用继续for循环了
break;
}
}
}catch(Throwable t){
t.printStackTrace();
}
}
}
然后需要在合适的时机调用
@Override
protected void onDestroy() {
super.onDestroy();
//Activity销毁的时候
fixInputMethodManagerLeak(this);
}
EditText,TextView造成的内存泄漏问题
TextView,EditText都有android:hint
属性,倘若你在每处使用EditText或TextView的地方均设置android:hint
则不再出现内存泄漏
你也可以使用另一种方式,在你使用TextView或者EditText的地方找到ChangeWatcher监听器,然后取消这个监听。
https://stackoverflow.com/questions/18348049/android-edittext-memory-leak
https://stackoverflow.com/questions/14135931/memory-leak-through-iclipboarddatapasteeventimpl
https://stackoverflow.com/questions/6217378/place-cursor-at-the-end-of-text-in-edittext