切换按钮中的方法崩溃

时间:2014-11-28 06:42:49

标签: java android onclicklistener togglebutton android-handler

嘿伙计我有一个问题,我试图每三十秒运行一次的方法导致我的切换按钮崩溃。我的目标是基于按钮单击将数据发送到数据库,并且当切换按钮打开时,每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方法向我发送错误的堆栈跟踪,所以我无法发布堆栈跟踪现在

如果有人对出现问题或我能解决的问题有什么建议,我们将不胜感激。再一次,抱歉没有能够立即启动堆栈跟踪,如果我能够获得它,我将编辑该帖子。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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