2011-02-23 57 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