OnClickListeners:防止内存泄漏

时间:2019-12-20 05:37:42

标签: android memory-leaks onclicklistener

多次点击按钮将打开许多新屏幕(活动)。为了防止这种情况,我附加了一个标志来防止这种情况。但这可能会导致内存泄漏。经过大量搜索后,我找到了一种解决方案。它将附加OnClick侦听器onResume,并在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;
  }

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以按常规方式设置点击监听器。然后,您可以在launchMode文件中将活动的singleTop设置为Manifest.xml。您的活动不应该泄漏。为了进一步阅读,您可以对launchMode

进行here的了解。

答案 1 :(得分:0)

我不认为这里存在泄漏,但是真正的问题是您允许用户多次按下按钮,因此您需要对监听器进行反跳。

最好的方法是使用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() }
}

不要忘记将它们添加到CompositeDisposable中,并将它们添加到clear()(对于onDestroy())或Activity(对于onDestroyView() )方法。


另一种选择是将ButterKnifeFragment一起使用,但是如果您希望将来轻松切换到Kotlin,则首选RxBinding(对于Kotlin,另一种可能性是使用协程,但是使用协程的消泡剂可以在某些情况下很难实现,例如@OnClick(/* viewId */)的观察者。