我在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;
}

07-24 09:44
查看更多