【问题标题】:Method in Toggle Button crashes切换按钮崩溃中的方法
【发布时间】:2014-11-28 06:42:49
【问题描述】:

大家好,我遇到了一个问题,即我尝试每 30 秒运行一次的方法导致我的切换按钮崩溃。我的目标是根据按钮单击将数据发送到数据库,并在切换按钮打开时每三十秒通过一个方法继续发送该数据。当我单击按钮时,我收到了不幸的错误并且应用程序崩溃了。

为了节省这篇文章的长度,这个只发送一次数据的按钮可以正常工作:

uploadOnce.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view) {
                try {
                    SendCode(socket);
                }catch(Exception e){
                    String stackTrace = Log.getStackTraceString(e);
                    sendEmail(stackTrace);
                }
            }
        });

请注意,上面的按钮点击使用了 SendCode 方法,并且可以正常工作。

我遇到的错误是使用带有计时器的相同方法,如下所示:

这是 onClick 的切换按钮:

toggle.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            try {
                if (toggle.isChecked()) {
                    makeToast("On");
                    sendForever();
                }
            }catch (Exception e){
                String stackTrace = Log.getStackTraceString(e);
                sendEmail(stackTrace);
            }
        }
    });

如果我取消 sendForever() 方法,切换按钮会按预期正常工作。

这是切换按钮中的 sendForever 方法:

public void sendForever(){
    if(toggle.isChecked()) {
        while (toggle.isChecked()) {
            try {
                new Handler().postDelayed(new Runnable() {
                    // Runs a timer to send code to database every 30 seconds
                    @Override
                    public void run() {
                        try {
                            SendCode(socket);
                        } catch (Exception e2) {
                            String stackTrace = Log.getStackTraceString(e2);
                            sendEmail(stackTrace);
                        }
                    }
                }, 30000);
            } catch (Exception e) {
                String stackTrace = Log.getStackTraceString(e);
                sendEmail(stackTrace);
            }
            sendForever();
        }
    }
}

所以目标是,当调用此方法时,它会检查切换按钮是否处于“ON”状态,然后在它打开时它将运行 SendCode 方法(在发送按钮中工作正常仅一次)然后等待 30 秒。 30 秒结束后,我将再次调用该方法,直到再次按下切换按钮并中断循环。

我遇到的问题是我在汽车的 OBD2 传感器上使用它,它没有使用 sendEmail 方法向我发送错误的堆栈跟踪,所以我无法发布堆栈跟踪现在。

如果有人对出了什么问题或我可以解决这个问题有任何建议,我们将不胜感激。再次,很抱歉现在无法放置堆栈跟踪,如果我能够获得它,我将编辑该帖子。

【问题讨论】:

    标签: java android onclicklistener togglebutton android-handler


    【解决方案1】:

    您从方法本身调用sendForever()在循环中,甚至)。这将导致堆栈溢出,因为递归仅受切换条件限制。只需删除递归调用,因为您已经有循环处理重复(嗯,这将解决堆栈溢出,但请参阅下一段以了解更多问题)。

    还请注意,您有一个 阻塞 任务在 UI 线程中运行。由于您阻塞了 UI 线程,因此工具包将没有机会使按钮不再被切换,从而基本上锁定了您的应用程序。最简单的可能是在上一次发送完成后检查条件,并在需要时安排新的发送。

    附注:无需在if (toggle.isChecked()) 中检查sendForever(),因为您在while 循环中具有相同的条件。

    【讨论】:

      【解决方案2】:

      尝试将堆栈跟踪转储到文件系统而不是电子邮件...可能是您的整个应用程序正在崩溃 或者您可能应该发布 SendCode(socket) 的代码,该函数可能会锁定一些在 30 秒内未释放的资源,即在进行下一个函数调用之前

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-31
        • 2021-12-16
        • 2013-04-19
        • 2013-01-19
        • 2015-04-23
        • 1970-01-01
        • 2019-09-04
        • 1970-01-01
        相关资源
        最近更新 更多