Snackbar 在替换另一个时有时不会出现

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 calledonShown-callback没有了叫。

为什么会发生这种情况?我应该将此报告为问题吗?任何已知的解决方法?

Day*_*Day 8

我还没有找到它发生的真正原因,也没有找到问题的真正解决方案,但我找到了一个对我有用的解决方法:

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)