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


虽然给定引用未直接涉及form按钮点击崩溃的解决办法,但可从一般情况分析。 ### 检查按钮类型与事件绑定 若按钮类型设置不当,可能导致点击崩溃。如ASP.NET的BUTTON服务器控件,当UseSubmitBehavior设置为false后,按钮类型从提交按钮变为普通按钮,需执行click事件来提交页面,若事件绑定异常就可能崩溃。要确保按钮类型和事件绑定正确,若使用ASP.NET的BUTTON服务器控件,需保证其事件绑定逻辑无误,可查看页面源文件确认按钮的type属性和onclick事件内容是否符合预期。若type属性为"button",则需确保onclick事件能正确触发页面提交逻辑 [^1]。 ### 检查代码逻辑 若使用类似Pycharm结合qt designer设计界面,给button添加点击事件响应时,代码逻辑错误会造成点击崩溃。要确保事件响应函数的代码逻辑正确,如在AES加密解密项目实例中,使用`self.button.clicked.connect(on_button_clicked)`绑定事件,需保证`on_button_clicked`函数内部代码无语法错误和逻辑错误 [^2]。 ### 调试与日志记录 在开发环境中,使用调试工具逐步执行代码,找出点击按钮时崩溃的具体位置。可在关键代码处添加日志记录,输出变量值和执行步骤,便于定位问题。 ### 示例代码检查(以Python和Qt为例) ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton def on_button_clicked(): try: # 这里写按钮点击后的具体逻辑 print("Button clicked") except Exception as e: print(f"Error: {e}") app = QApplication(sys.argv) window = QWidget() button = QPushButton('Click me', window) button.clicked.connect(on_button_clicked) window.show() sys.exit(app.exec_()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值