Android DataBinding 正在泄漏内存

标签 android kotlin android-databinding

我正在使用数据绑定(bind)并且我已经声明了 lateinit var对于绑定(bind)以及当我要去不同的 fragment Leaky canary 显示泄漏时。

fragment

class HomeFragment : BottomNavViewHostBaseFragment() {

    private lateinit var viewModel: HomeViewModel
    private lateinit var binding: FragmentHomeBinding

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java)
        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false)
        binding.lifecycleOwner = viewLifecycleOwner
        binding.viewModel = viewModel
        return binding.root
    }

   ...
}

这是来自 Leaky Carny 的信息
androidx.constraintlayout.widget.ConstraintLayout has leaked:
Toast$TN.mNextView
↳ LinearLayout.mContext
↳ MainActivity.navigationView
↳ NavigationView.listener
↳ BaseFragment$setNavigationDrawerItemSelectedListener$1.this$0 (anonymous implementation of com.google.android.material.navigation.NavigationView$OnNavigationItemSelectedListener) ↳ OrdersHostFragment.mFragmentManager
↳ FragmentManagerImpl.mActive
↳ HashMap.table
↳ array HashMap$HashMapEntry[].[0]
↳ HashMap$HashMapEntry.value
↳ HomeFragment.!(binding)!
↳ FragmentHomeBindingImpl.!(mboundView0)!
↳ ConstraintLayout

我该如何解决这个问题,我需要做什么binding=null里面 onDestroyView ?但是,如果我需要这样做,那么 binding.lifecycleOwner = viewLifecycleOwner 的意义何在?然后?

最佳答案

这是来自 google docs 的推荐方式初始化和清除 Fragments 中的绑定(bind):

Kotlin :

private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = ResultProfileBinding.inflate(inflater, container, false)
    val view = binding.root
    return view
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}

java :
private ResultProfileBinding binding;

@Override
public View onCreateView (LayoutInflater inflater, 
                          ViewGroup container, 
                          Bundle savedInstanceState) {
    binding = ResultProfileBinding.inflate(inflater, container, false);
    View view = binding.getRoot();
    return view;
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    binding = null;
}

另外,这里是 medium blog post阅读以摆脱与 Property Delegate 的绑定(bind)内存泄漏。

关于Android DataBinding 正在泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57647751/

相关文章:

Android 在警报对话框中设置文本

android - 使用数据绑定(bind)库时需要调用 DataBindingUtil.setContentView() 吗?

java - 如何在Activity之间传递ObservableInt?

android - 布局中的算术运算 - Android Data Binding

java - LVL 在 Jelly Bean 上崩溃

单击 BadTokenException 时出现 Android Spinner 异常

android - 在导航组件中隐藏工具栏或底部导航栏

Kotlin 将非英文字符打印为问号

kotlin - 检测具体化类型中的可空性

java - 使用java或kotlin在libs中搜索aar文件名