2011-08-07 3 views
2

私のアンドロイドアプリケーションには単純なボタンonClickListenerがありますが、それはデータベースにいくつかのものを書き込むことです。それは、今、これはうまく動作しますが、私は十分に速くボタンをタップした場合、私は何もしてからキーリスナーを防ぐことができますどのように閉じられたDBエラーandroid locking eventListenerとeven handling

java.lang.IllegalStateException: database not open 

を取得し、この

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(); 
    } 
} 

ようになります前のキーイベントがハンドリングされる前に?

編集:一部のユーザーは、Activity.onDestroy()でデータベースを閉じることを提案しました。これはかなりいいですし、彼は答えを削除しました。それは私の問題の素晴らしい回避策ですが、まだ私が探している解決策ではありません。

また、ボタンを無効にして、さまざまな位置でボタンを有効にすると、問題が残ります。あまりにも速くボタンをタップすると、私はいつも関数が1回だけ呼び出されることを達成することができるようです。

+2

どこのデータベースが開かれていますか? – Pikaling

+0

私はデータベースを 'onCreate'イベントで開きます。なぜなら、それ以前にやることがいくつかあるからです。 'closeDatabase()'は実際には 'finishActivity()'ですが、これは質問には関係しないと思いました。私はこれが役立つことを願っています – zidarsk8

答えて

1

ここで使用できるUIトリックは、ユーザーがクリックすると無効にすることができます。ちょうどこのような何かをしなさい:

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

あなたがする必要がある場合もちろんonClick機能の終わりにボタンを可能にすることができます。

ボタンを無効にしている間、ユーザーはそれをクリックすることができないため、2つのonClickイベントが発生することはありません。さらに、ボタンのスタイルが変化するので、クリックすると何もしないことがわかります。

このテクニックはすべての場所で使用されています(Gmailの送信ボタンなど)。いいテクニックだと思います。

ユーザーがボタンを何回か押したままにしてもらいたい場合は、実際には非常に速く、決して緩んではいけません。また、一回のプレスをスキップすることもありません。しかし、私は生と死の問題があるゲームでは、これが必要であると想像することができます:)

+0

面白いのは、onClickイベントの最後にボタンを有効にすることができないため、毎回有効にして何も変わらないということです。その余分なクリックは、アクティビティがその物を終わらせて死ぬことを試みているときに発生するようです。 – zidarsk8