Day*_*Day 6 android android-snackbar
我在 android 上遇到了 Snackbars 的一个奇怪问题。我通过 Snackbar + Retry-Action 显示错误消息。当单击“重试”并且错误仍然存在(例如没有互联网)时,我再次显示错误。单击 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");
}
Run Code Online (Sandbox Code Playgroud)
与此代码出现问题后,当我看看logcat中,最后一行是show called和onShown-callback没有了叫。
为什么会发生这种情况?我应该将此报告为问题吗?任何已知的解决方法?
我还没有找到它发生的真正原因,也没有找到问题的真正解决方案,但我找到了一个对我有用的解决方法:
private Snackbar currentlyShownSnackbar;
private void showSnackbar() {
Snackbar snackbar = Snackbar.make(...);
snackbar.show();
currentlyShownSnackbar = snackbar;
}
Run Code Online (Sandbox Code Playgroud)
只需保持对当前显示的 Snackbar 的引用,这个问题就不会再发生了。我不知道为什么,可能与过早的垃圾收集有关。
代码检查会说该变量已分配但从未使用 - 可以忽略此警告。
我还在我的活动中添加了这个以防止任何可能的内存泄漏:
public void onPause() {
super.onPause();
this.currentlyShownSnackbar = null;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1550 次 |
| 最近记录: |