多次点击按钮将打开许多新屏幕(活动)。为了防止这种情况,我附加了一个标志来防止这种情况。但这可能会导致内存泄漏。经过大量搜索后,我找到了一种解决方案。它将附加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;
}
谢谢!
答案 0 :(得分:0)
您可以按常规方式设置点击监听器。然后,您可以在launchMode
文件中将活动的singleTop
设置为Manifest.xml
。您的活动不应该泄漏。为了进一步阅读,您可以对launchMode
答案 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()
)方法。
另一种选择是将ButterKnife与Fragment
一起使用,但是如果您希望将来轻松切换到Kotlin,则首选RxBinding(对于Kotlin,另一种可能性是使用协程,但是使用协程的消泡剂可以在某些情况下很难实现,例如@OnClick(/* viewId */)
的观察者。