如何修复TextView上的内存泄漏

时间:2019-06-15 21:26:48

标签: android memory-leaks dagger-2 mvp

我是匕首和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设置为屏幕外。 但就我而言,我的textview位置正确。所以我不认为泄漏是为了这个。

在约束布局上的单击侦听器上设置有问题吗?

1 个答案:

答案 0 :(得分:0)

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