我在android上遇到了一个关于snackbar的奇怪问题。我通过snackbar+重试操作显示错误消息。单击“重试”时,错误仍在此处(例如没有Internet),我将再次显示错误。
单击snackbar中的操作会自动解除当前显示的snackbar,并在旧的snackbar仍“淡出”时显示新的snackbar。
但有时(当我点击“重试”大约30次时),当我多次按下按钮后,一个snackbar根本不会出现。
我可以用这个简单的代码复制它:
final View.OnClickListener retryListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
showSnackbar();
}
};
private void showSnackbar() {
Snackbar snackbar = Snackbar.make(root, "Error", BaseTransientBottomBar.LENGTH_INDEFINITE)
.setAction("Retry", retryListener)
//Callback only for debugging-purposes
.addCallback(new BaseTransientBottomBar.BaseCallback<Snackbar>() {
@Override
public void onShown(Snackbar transientBottomBar) {
super.onShown(transientBottomBar);
Log.d(TAG, "onShown called");
}
});
snackbar.show();
Log.d(TAG, "show called");
}
当我在这段代码出现问题后查看logcat时,最后一行是
show called
,并且不再调用onShown
-callback。为什么会这样?我应该把这当作一个问题来报告吗?有什么解决办法吗?
最佳答案
我没有找到它发生的真正原因,也没有找到解决问题的真正办法,但我找到了一个对我有效的解决方法:
private Snackbar currentlyShownSnackbar;
private void showSnackbar() {
Snackbar snackbar = Snackbar.make(...);
snackbar.show();
currentlyShownSnackbar = snackbar;
}
只要保持对当前显示的snackbar的引用,这个问题就不会再发生了。我不知道为什么,可能是因为收垃圾太早了。
代码检查将说明此变量已分配但从未使用-此警告可以忽略。
我还将此添加到活动中,以防止任何可能的内存泄漏:
public void onPause() {
super.onPause();
this.currentlyShownSnackbar = null;
}