Button疯狂点击崩溃问题


例子

疯狂点击按钮经常会导致崩溃问题,这是因为在处理点击事件的时候还能接收点击事件

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里都做下这个判断,不然崩溃了就出大事了)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值