有经验的android开发人员一般都会遇到一个按钮被快速点击的时候遇到的问题,特别是有线程存在的情况下,问题很明显。当然不同按钮同时或快速点击的时候也会引发问题。这些问题原因无非就是按钮点击之后还没处理完成,另外一个按钮就开始执行了。因此为了解决这样的问题大家都会想到设置两个按钮之间的时间,当快速点击的时候就不执行。类似代码应该是这样的:
boolean canClick = true;
long lastTime = Comm.stringToLong(AppConfig.Session.get("clicktime"));
if(lastTime != 0L){
long diffTime = System.currentTimeMillis() - lastTime;
if(diffTime < 1000){
canClick = false;
}else{
AppConfig.Session.put("clicktime",System.currentTimeMillis());
}
}else{
AppConfig.Session.put("clicktime",System.currentTimeMillis());
}
这样的限制确实能够防止按钮快速点击引起的问题。但是这里有个问题,就是快速点击的时候,不执行的那个按钮就会像是没反应一样,给人的感觉很不好。因此,这里我用的是另外一种办法。办法其实也不难。就是当你点击按钮的时候推迟一定的时间执行,并记录当前时间,然后等这段时间过后再执行原本要执行的方法体。当快速点击的时候只会执行最后一次点击事件。可能说法会有点绕,下面我直接给出代码,想必大家可以看的懂。
public void onClick(View v) {
AppConfig.Session.put("clicktime",System.currentTimeMillis() );
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
boolean canClick = false;
lastClickTime = Comm.stringToLong(AppConfig.Session.get("clicktime"))
long diffTime = System.currentTimeMillis() - lastClickTime;
if(diffTime >= 500){
canClick = true;
}
if(canClick){
//TODO
}
}};
Thread thread = new Thread(){
@Override
public void run() {
try {
Thread.sleep(500);
Message msg = Message.obtain();
handler.sendMessage(msg);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
thread.start();
}
有什么问题直接给我留言