常见内存泄漏以及个人解决方法

内存泄漏问题检测使用 LeakCanary

多线程操作造成的内存泄漏以及崩溃问题(RxJava2为例)

首先配置BaseActivity

    public List disposableList=new ArrayList<>();

    @Override
    protected void onPause() {
        super.onPause();
        //在Activity执行onPause的时候取消所有订阅
        if (disposableList.size()>0){
            for (int i=0;i

然后在Activity页面添加你的逻辑所订阅的所有Observer

....subscribe(new Observer() {
                        @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:[email protected]
                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

你可能感兴趣的:(常见内存泄漏以及个人解决方法)