吐司"再次按回来关闭"在经常按下时会出错

时间:2015-05-06 17:49:14

标签: java android eclipse toast back-button

我的目标:

当访问者返回我的应用的第一页时,会出现一个Toast,让访问者知道他可以在3秒内再次按下后退按钮关闭Android应用。

具体问题:

当您返回第一页并显示吐司时,只有一次按回一次但是当吐司出现并且您多次按回一次时代码才能正常工作,会出现以下错误消息:" (appname)已停止"。

有谁知道导致此错误消息的原因以及我如何解决此问题?

MainActivity.java文件:

// Open previous opened link from history on webview when back button pressed

private Boolean exit = false;
@Override
// Detect when the back button is pressed
public void onBackPressed() {
    if(webView.canGoBack()) {
        webView.goBack();
    }
    else {
        if (exit)
            this.finish();
        else {
            Toast.makeText(this, "Press again to exit.",
                Toast.LENGTH_SHORT).show();
                exit = true;
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        exit = false;
                    }
                }, 3 * 1000);
        }    

    }
}

1 个答案:

答案 0 :(得分:2)

当您快速单击后退按钮时,它会多次调用this.finish(),从而导致崩溃。

你可以做两件事来防止这种情况发生。第一种是在致电exit后将this.finish()标志设置为false。

此外,为了防止多次快速点击试图关闭应用程序的竞争条件,您可以设置一个时间戳,该时间戳只允许在每三秒钟时间窗口中安排一个关闭事件:

    private Boolean exit = false;
    private long timeStamp = 0;
    private Handler handler = new Handler();
    @Override
    // Detect when the back button is pressed
    public void onBackPressed() {
        if(webView.canGoBack()) {
            webView.goBack();
        }
        else {
            if (exit) {
                exit = false; //added
                this.finish();
            }
            else {

                //added:
                if (timeStamp == 0 || (System.currentTimeMillis() - timeStamp) > 3000) {
                    Toast.makeText(this, "Press again to exit.",
                        Toast.LENGTH_SHORT).show();
                    exit = true;

                    timeStamp = System.currentTimeMillis(); //added

                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            exit = false;
                        }
                    }, 3 * 1000);
                }
            }

        }
    }