2012-05-17 78 views
3

我嘗試使用此代碼來防止在ImageView中多次點擊,但它沒有幫助。避免在圖像視圖中多次點擊android

Boolean isClicked = false; 
    @Override 
    public void onClick(View v) 
    { 
     if (v == imgClick && !isClicked) 
     { 
         //lock the image 
      isClicked = true; 
      Log.d(TAG, "button click"); 

      try 
      { 
       //I try to do some thing and then release the image view 
       Thread.sleep(2000); 
      } catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
      isClicked = false; 
     } 

    } 

在日誌中的貓,我可以看到5號線「按鈕,點擊」我儘可能快地在ImageView的點擊5次。我可以看到日誌貓打印第一行,等待一會兒(2秒),然後打印下一行。
我覺得當我點擊ImageView時,被觸發的事件會按順序移動到隊列中,不是嗎?那我怎麼能阻止呢?
我也嘗試使用setEnable()setClickable()而不是isClicked變量,但它不起作用。

回答

3

剛剛嘗試這方面的工作代碼

Boolean canClick = true; //make global variable 
    Handler myHandler = new Handler(); 

@Override 
public void onClick(View v) 
{ 
    if (canClick) 
    { 

     canClick= false; //lock the image 
     myHandler.postDelayed(mMyRunnable, 2000); 

     //perform your action here 

    } 

} 

/* give some delay..*/ 
    private Runnable mMyRunnable = new Runnable() 
    { 
     @Override 
     public void run() 
     { 

     canClick = true; 
     myHandler.removeMessages(0); 
     } 
    }; 


Instead of sleeping in 2 seconds, I use some task like doSomeThing() method (has accessed UI thread), and I don't know when it completed. So how can I try your way? 

//我提到這個Android link。您可以處理線程更有效,但我希望下面的代碼會爲你工作.. //你試試這個,

Boolean canClick = true; //make global variable 
public void onClick(View v) { 
     if(canClick){ 

      new DownloadImageTask().execute(); 
     } 
    } 

     private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 


      protected Bitmap doInBackground(String... urls) { 
       Log.d("MSG","Clicked"); 
       canClick =false; 
       //perform your long operation here 

       return null; 
      } 

      protected void onPostExecute(Bitmap result) { 
       canClick =true; 
      } 
     } 
+0

而不是在2秒鐘內睡覺,我使用doSomeThing()方法(已訪問UI線程)等一些任務,並且我不知道它何時完成。那麼,我該如何嘗試你的方式? – R4j

+1

+1爲整潔的答案和這種問題的最佳技術。 – rekaszeru

1

你可以在你的View跟蹤最後消耗的點擊,並在此基礎上執行任意必要的行動,或簡單地返回:

private long calcTime; 
private boolean isClickedLately(final long millisToWait) 
{ 
    if (System.currentTimeMillis() - calcTime < millisToWait) 
     return true; 
    return false; 
} 

@Override 
public void onClick(View v) 
{ 
    if (isClickedLately(2000)) 
     return; 
    calcTime = System.currentTimeMillis(); 
    Log.d(TAG, "consuming button click"); 
    // perform the necessary actions 
} 

隨着millisToWait參數可以調整的「等待」的門檻,但如果你知道你要等待連續兩次點擊之間正好2秒鐘,就可以消除它。

這樣你不必處理Threads,這很好,因爲讓GUI線程等待並不是一個好主意。

+0

問題是我不知道什麼時候我的任務已經完成(例如我給了2秒以上的時間) – R4j

+0

然後你應該選擇'@ vnshetty's'答案,它是完整和徹底的,除了它是這種任務的最佳選擇完全按照他的建議將'Handler'與'AsyncTask'結合在一起。在我的回答中,我將焦點集中在使圖像在已知時間間隔內無響應的問題上,但如果您正在執行長時間運行的方法,則使用「AsyncTask」(在單獨的後臺線程中)。 – rekaszeru