首页 > 解决方案 > 如何修复textview上的内存泄漏

问题描述

我是 dagger 和 mvp 模式的新手,我有内存泄漏。
我不确定内存泄漏的原因是什么。
我认为泄漏的原因是 txtCityName
但也许我的错误是在匕首或 mvp 中。
如果您需要更多详细信息来回答评论,请。

@OnClick(R.id.constraintLayoutCity)
    void onCityClick() {
        searchPresenter.getCity();
    }

 public void getCity() {
        cities = new CharSequence[]{"manchester", "london", "madrid", "barcelona"};
        adb.setSingleChoiceItems(cities, 0,(d, n) -> {
            selectedCity = n;
            view.setCity(cities[n].toString());
            d.dismiss();
        });
        adb.setTitle("select a city");
        adb.show();
    }

 public void setCity(String city) {
        txtCityName.setText(city);
    }
LeakingInstance(referenceKey=7b6a8af5-1103-44d0-91c4-5cb25597d2a2, referenceName=, instanceClassName=androidx.constraintlayout.widget.ConstraintLayout, watchDurationMillis=5151, excludedLeak=false, leakTrace=
┬
├─ ir.reservs.reservs.ui.main.search.SearchFragment
│    Leaking: NO (Fragment#mFragmentManager is not null)
│    ↓ SearchFragment.txtCityName
│                     ~~~~~~~~~~~
├─ androidx.appcompat.widget.AppCompatTextView
│    Leaking: YES (View#mAttachInfo is null)
│    View.mID=R.id.txtCityName (2131362166)
│    View.mWindowAttachCount=1
│    ↓ AppCompatTextView.mParent
├─ androidx.constraintlayout.widget.ConstraintLayout
│    Leaking: YES (View#mAttachInfo is null)
│    View.mID=R.id.constraintLayoutCity (2131361908)
│    View.mWindowAttachCount=1
│    ↓ ConstraintLayout.mParent
╰→ androidx.constraintlayout.widget.ConstraintLayout
​     Leaking: YES (RefWatcher was watching this)
, retainedHeapSize=null)```

我读到 textview 内存泄漏的原因是 textview 设置在屏幕外。但就我而言,我的文本视图在正确的位置。所以我不认为泄漏是为了那个。

在约束布局上设置点击监听器有问题?

标签: androidmemory-leaksdagger-2mvp

解决方案


我怀疑您在演示者中引用了 txtCityName。通常,内存泄漏是由引用活动或片段的静态成员引起的,然后当该活动或片段被系统销毁时,垃圾收集器由于静态引用而无法清理它。您的演示者永远不应该对您的片段一无所知。txtCityName 是在演示者中引用还是在片段之外的项目中的任何地方引用?


推荐阅读