嘿伙计我有一个问题,我试图每三十秒运行一次的方法导致我的切换按钮崩溃。我的目标是基于按钮单击将数据发送到数据库,并且当切换按钮打开时,每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方法向我发送错误的堆栈跟踪,所以我无法发布堆栈跟踪现在
如果有人对出现问题或我能解决的问题有什么建议,我们将不胜感激。再一次,抱歉没有能够立即启动堆栈跟踪,如果我能够获得它,我将编辑该帖子。
答案 0 :(得分:2)
您可以从方法本身调用sendForever()
(循环,甚至)。这将导致堆栈溢出,因为递归仅受切换条件的限制。只需删除递归调用,因为您已经有循环处理重复(好吧,这将解决堆栈溢出,但请参阅下一段以了解更多问题)。
另请注意,您在UI线程中运行了阻止任务。由于您阻止了UI线程,因此工具包将无法再使按钮切换,从根本上锁定您的应用程序。最简单的可能是在上一次发送完成后检查条件,并在需要时安排新的条件。
附注:由于您在while循环中具有相同的条件,因此无需在if (toggle.isChecked())
中进行sendForever()
检查。
答案 1 :(得分:1)
尝试将堆栈跟踪转储到文件系统而不是电子邮件...可能是整个应用程序崩溃了 或者你应该发布SendCode(套接字)的代码,该函数可能会锁定一些未在30秒内释放的资源,即在下一次函数调用之前发布