2012-05-17 45 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