例子
疯狂点击按钮经常会导致崩溃问题,这是因为在处理点击事件的时候还能接收点击事件
module(CrazyClick)
举个例子,以下代码,点击一次,会进入onClick,在执行onClick执行的时候又点击了一次,那么待会会再次触发一次onClick.
public class ClickActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button tbv = (Button) findViewById(R.id.text);
tbv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// process
Log.d("aa", "click");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("aa", "over");
}
});
}
}
在看个例子
public class MainActivity extends ActionBarActivity {
ArrayList<String> aa;
Button tbv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tbv = (Button) findViewById(R.id.text);
aa = new ArrayList<>();
aa.add("a");
aa.add("b");
tbv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// process
Log.d("aa", "click");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("aa", "over");
aa.remove(0);
if (aa.size() == 0) {
tbv.setVisibility(View.GONE);
}
}
});
}
}
这里对按钮连点三次必崩,为什么,按理说点了2次之后按钮就会gone,但是这里由于onClick的执行不是瞬间的,所以存在按钮还没gone,但是我们已经点了第三次了,那必然会出发三次onClick,第三次的时候就会崩溃
解决问题的方法有2种,
一种是事件没有处理完,就让button不可点(一般来说,我们可以认为onClick事件会再500ms内处理完毕,这里故意sleep三秒只是一个实验,所以可以在按钮点击之后的500ms内让按钮disable)。
另一种方法是在每次onClick事件中做下判断,比如这里就判断下aa的size,这样可以保证避免崩溃(最后再onClick里都做下这个判断,不然崩溃了就出大事了)