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() }
}
不要忘记将这些添加到 CompositeDisposable
和 clear()
中 onDestroy()
(对于 Activity
)或 onDestroyView()
(对于 Fragment
) 方法。
另一种选择是将 ButterKnife 与 @OnClick(/* viewId */)
一起使用,但如果您希望将来轻松切换到 Kotlin,则首选 RxBinding(对于 Kotlin,另一种可能性是使用协程,但 deboucers 使用在某些情况下,协程可能很难实现,例如 EditText
).
的 watcher
多次点击按钮会打开许多新屏幕(活动)。为了防止这种情况,我附加了一个标志来防止这种情况。但它可能会导致内存泄漏。经过大量搜索后,我找到了一个解决方案。它是在 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() }
}
不要忘记将这些添加到 CompositeDisposable
和 clear()
中 onDestroy()
(对于 Activity
)或 onDestroyView()
(对于 Fragment
) 方法。
另一种选择是将 ButterKnife 与 @OnClick(/* viewId */)
一起使用,但如果您希望将来轻松切换到 Kotlin,则首选 RxBinding(对于 Kotlin,另一种可能性是使用协程,但 deboucers 使用在某些情况下,协程可能很难实现,例如 EditText
).