OnClickListeners:防止内存泄漏

OnClickListeners: Preventing memory leaks

多次点击按钮会打开许多​​新屏幕(活动)。为了防止这种情况,我附加了一个标志来防止这种情况。但它可能会导致内存泄漏。经过大量搜索后,我找到了一个解决方案。它是在 onResume 上附加 OnClick 侦听器,并在 onDetach 和单击按钮时将它们设置为 null。但是我发现这个很难实现。

我的代码:-

 private static int flag = 0;
 @Override
 public void onStart() {
   super.onStart();
   binding.createEventFab.setOnClickListener(view ->{
       Intent intent = new Intent(getActivity(), CreateEventActivity.class);
        if(flag == 0){
            startActivity(intent);
            flag++;
       }
    });
}
@Override
 public void onResume() {
        super.onResume();
        flag = 0;
  }

提前致谢!

您可以通过正常方式设置您的点击监听器。您可以在 Manifest.xml 文件中将 activity 的 launchMode 设置为 singleTop。你的活动不应该泄露。如需进一步阅读,您可以查看 here 关于 launchMode

我不认为这里有漏洞,但真正的问题是您允许用户多次按下按钮,因此您需要去抖动侦听器。

你能做的最好的事情就是使用 RxBinding,因为你可以很容易地在另一个 类 中使用它。

下面是示例代码:

RxView.clicks(/* Your view */)
        .throttleFirst(2, TimeUnit.SECONDS)
        .subscribe(s -> { /* Your code */  });

或在 Kotlin 中,具有很好的扩展

fun View.actionOnClick(function: () -> Unit): Disposable {
    return clicks()
        .throttleFirst(2, TimeUnit.SECONDS)
        .subscribe { function() }
}

不要忘记将这些添加到 CompositeDisposableclear()onDestroy()(对于 Activity)或 onDestroyView()(对于 Fragment) 方法。


另一种选择是将 ButterKnife@OnClick(/* viewId */) 一起使用,但如果您希望将来轻松切换到 Kotlin,则首选 RxBinding(对于 Kotlin,另一种可能性是使用协程,但 deboucers 使用在某些情况下,协程可能很难实现,例如 EditText).

的 watcher