2011-02-23 60 views
0

你好 我有一個ImageButton與單個圖像。我添加了onclick事件,並且通常它工作正常。當單擊Imagebutton時,我的添加入口函數起作用。Android GUI ::連續點擊事件掛起

現在當用戶連續點擊我的圖像按鈕時,我的添加入口函數會用相同的數據執行多次。我想阻止它。這樣,Imagebutton不應該排隊處理下一個點擊事件,直到我的函數完全執行完畢。

一旦執行了OnClick事件,我就嘗試了myImageButton.setEnable(false)。並做

myImageButton.setEnable(true)後我的數據錄入功能。

我也試過把這段代碼放在myImageButton.isEnabled(),但沒有奏效。

如何忽略這種排隊的點擊事件?有沒有其他方式(比setEnable())忽略/吃點擊處理?

我已通過將println語句檢查出每個單擊事件是同步的......意味着所有代碼都按順序執行。

編輯

private OnClickListener m_AddClickHandler = new OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      if(m_bDoAdd) 
      { 
       m_bDoAdd = false; 
       new AddTask().execute(); 
      } 
      else 
       logData("Add::OnClick::not clicked"); 
     } 
    }; 
private class AddTask extends AsyncTask<Void, Void, Integer> 
    { 
     @Override 
     protected Integer doInBackground(Void... params) 
     { 
      logData("doinbg, start"+m_bDoAdd); 
      int iStatus =Add(m_data); 
      logData("doinbg, start end, status="+iStatus+"flag="+m_bDoAdd); 
      return iStatus; 
     } 

     @Override 
     protected void onPostExecute(Integer result) 
     { 
      logData("onpostExec, start"+m_bDoAdd); 
      int iStatus = result; 
      if (iStatus == 0) 
      { 
       Toast.makeText(getApplicationContext(), R.string.strAdded, Toast.LENGTH_SHORT).show(); 
      } 
      else if (iStatus == 1) 
      { 
       Toast.makeText(getApplicationContext(), R.string.strAlreadyExists, Toast.LENGTH_SHORT).show(); 
      } 
      else 
      { 
       Toast.makeText(getApplicationContext(), R.string.strAddFailed, Toast.LENGTH_SHORT).show(); 
      } 

      m_bDoAdd = true; 
      logData("onpostExec, end"+m_bDoAdd); 
     } 
    } 

    void Add() 
    { 
     // Add info to db (takes few msecs) 
    } 

我仍然沒有得到 「添加:: ::的OnClick未點擊」 日誌。

還有什麼線索?

+0

你應該使用setClickable(boolean) - 總是爲我工作。 – Klaus 2011-02-23 12:58:11

回答

1

嘗試此的onClick處理程序內:

myImageButton.setClickable(false); 

更新:

這是how events work in Android

  1. 當用戶點擊一個視圖的事件被添加到事件隊列。
  2. 事件在EDT上以串行方式處理:一個接一個。
  3. 事件排隊和事件分派是在單獨的線程中完成的:處理事件不會阻止排隊新事件。

一個解決問題的方法:

  1. 你應該儘可能快地處理事件,而不是阻止EDT。這意味着您應該在後臺線程中執行所有長時間運行的任務(=您的數據庫操作) - 爲此使用AsyncTask。
  2. 當您開始後臺任務時,您應該設置一個標誌(backgroundWorkRunning)並在完成時清除它。
  3. 當發送新事件時,首先檢查backgroundWorkRunning標誌。如果已經設置了標誌,則不做任何事
+0

它幫助,但一點點。在15次連續點擊中,只有2次被避免。 – JRC 2011-02-24 05:20:57

+0

我更新了可能的解決方案的帖子。 – 2011-02-24 08:56:41

1

也許你可以使用全局標誌,如默認設置爲false的布爾變量,當它爲false時,執行addd entry函數。在進入函數時將標誌設置爲true。希望這可以幫助。

+0

試過了,沒有運氣 – JRC 2011-02-24 04:41:59

+0

你可以發佈你的代碼嗎? – 2011-02-24 05:19:28

+0

add m_ivAdd.setClickable(true);裏面的功能添加,在它的末尾.. – 2011-02-24 06:28:26

0

你可以使用一個靜態布爾變量,在你的點擊事件處理中你設置了true。當你點擊那個按鈕標記它是真的,並且應用一個if塊來檢查天氣變量是否爲真。當您的任務完成並且代碼流即將存在onClickListener時,您可以再次將該布爾變量設置爲false。

+0

嘗試過,沒有運氣 – JRC 2011-02-24 05:20:19