2011-08-07 34 views
2

我在我的android应用程序中有一个简单的onClickListener按钮,它所做的就是将一些东西写入数据库。它看起来是这样的android锁定eventListener,甚至处理

private void setEventListeners(){ 
    mSpecialViewClass.getSubmitButton().setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      handleSubmitClick(); 
     } 
    }); 
} 

private void handleSubmitClicks(){ 
    if (counter<0){ 
     writeCounterToDb(); 
    } else { 
     //do some stuff 
     closeDatabase(); 
    } 
} 

现在这个工作得很好,但如果我点击按钮速度不够快,我得到一个封闭的DB错误

java.lang.IllegalStateException: database not open 

如何防止关键监听器做任何事情,在之前的关键事件被处理之前?

编辑︰一些用户建议关闭我的数据库上Activity.onDestroy()这是相当不错的,他删除了答案。对于我的问题,这是一个很好的解决方法,但仍然不是我正在寻找的解决方案。

我也尝试禁用按钮并启用各种位置上的按钮,问题依然存在。看起来我总是可以实现该功能多次被调用,如果我点击按钮的速度太快。

+2

你的数据库在哪里打开? – Pikaling

+0

我在'onCreate'事件中打开了我的数据库,因为在此之前我还做了一些其他事情。而'closeDatabase()'实际上是一个'finishActivity()',但我不认为这与问题有关。我希望这有帮助。 – zidarsk8

回答

1

一个很好的用户界面技巧,你可以在这里使用,就是在用户点击后禁用按钮。只要做这样的事情:

@Override 
public void onClick(View arg0) { 
    arg0.setEnabled(false); 
    handleSubmitClick(); 
} 

如果您需要,您当然可以启用onClick函数末尾的按钮。

当按钮被禁用时,用户将无法点击它,所以你永远不会得到两个onClick事件。更重要的是,按钮的风格发生了变化,所以用户会知道点击不会做任何事情。

这种技术被广泛使用(例如Gmail的发送按钮),我认为这是一个很好的UI设计。

现在如果你想允许你的用户多次按下一个按钮,真的很快,永远不会松动或跳过一个按钮,你需要实现某种排队机制。但我只能想象这是在有生命和死亡问题的游戏中必不可少的:)

+0

有趣的是,我不能启用onClick事件结束时的按钮,因为每次我都会启用它,而且没有任何变化。似乎这些额外的点击发生在活动尝试完成其内容并死亡时。 – zidarsk8