Android 3秒后取消对话框-多次使用后继续崩溃我的应用程序
我有一个扩展的对话类,我想显示3秒钟,然后消失。这在前两次调用时效果很好,但之后它会使我的应用程序崩溃。诚然,我不是线程方面的佼佼者,我想这就是我的问题所在。正如您可以从下面的代码(注释掉的部分)中看到的,我尝试使用取消事件来终止生成的线程,但这会使它在第一次运行时崩溃。我还尝试在父类的UI线程上执行所有这些操作,结果与此相同(显示对话框3次后崩溃)Android 3秒后取消对话框-多次使用后继续崩溃我的应用程序,android,multithreading,dialog,timer,Android,Multithreading,Dialog,Timer,我有一个扩展的对话类,我想显示3秒钟,然后消失。这在前两次调用时效果很好,但之后它会使我的应用程序崩溃。诚然,我不是线程方面的佼佼者,我想这就是我的问题所在。正如您可以从下面的代码(注释掉的部分)中看到的,我尝试使用取消事件来终止生成的线程,但这会使它在第一次运行时崩溃。我还尝试在父类的UI线程上执行所有这些操作,结果与此相同(显示对话框3次后崩溃) 当收到onCancel事件时,您正在调用t.destroy(),destroy是一种不推荐使用的方法 如果您正在创建一个已经异步运行的计时器,则不
onCancel
事件时,您正在调用t.destroy()
,destroy
是一种不推荐使用的方法public class HandResults extends Dialog implements DialogInterface {
HandResults hr;
Timer myTimer;
Handler hand = new Handler();
public HandResults(Context context) {
super(context);
setContentView(R.layout.handresults);
hr = this;
}
public void showHands(){
this.show();
myTimer = null;
myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
hr.cancel(); // call the cancel method directly
}
}, 3000);
}
}
不需要创建自己的线程,因此上面的代码应该大致完成您正在尝试执行的操作
onCancel
事件时,您正在调用t.destroy()
,destroy
是一种不推荐使用的方法public class HandResults extends Dialog implements DialogInterface {
HandResults hr;
Timer myTimer;
Handler hand = new Handler();
public HandResults(Context context) {
super(context);
setContentView(R.layout.handresults);
hr = this;
}
public void showHands(){
this.show();
myTimer = null;
myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
hr.cancel(); // call the cancel method directly
}
}, 3000);
}
}
不需要创建自己的线程,因此上面的代码应该大致执行您正在尝试执行的操作。您不需要在此处处理,您可以在TimerTask内运行hand.post()。即使不需要TimerTask/Timer,也可以使用handler.postdayed()。 不过,我不知道你观察到的行为是从哪里来的。
此外,你应该考虑到你的对话框是早期关闭(例如当使用旋转屏幕)。在这种情况下,您可以调用handler.removeCallbacks()。这里不需要treat t,您可以在TimerTask中运行hand.post()。即使不需要TimerTask/Timer,也可以使用handler.postdayed()。 不过,我不知道你观察到的行为是从哪里来的。
此外,你应该考虑到你的对话框是早期关闭(例如当使用旋转屏幕)。在这种情况下,您可以调用handler.removeCallbacks()。我已将线程内容注释掉,我只是将其包含在代码中以表明我尝试过它。在任何情况下,您的代码执行与我以前相同的操作,它工作2次,然后应用程序强制关闭。我现在尝试了其他3个方法(handler.postdayed,从调用方法传递runnable和handler等),每个人都有相同的结果…它工作两次,然后失败。还有其他想法吗?结果是有其他原因导致它强制关闭(与此相关)。我是根据从套接字中得到的结果来显示的,我猜我编写的套接字类中的线程在这里是冲突的……我不确定,但是当我从等式中去掉这个时,您的代码工作得很好。所以我想我需要回到绘图板上,找到另一种调用showHands()方法的方法:/谢谢你的帮助。@Kyle,你得到了什么异常?我不确定。它只是强制关闭应用程序。有没有办法将异常记录到某个地方?(我意识到这是一个非常生疏的问题,我提前为我的提问道歉)。一旦应用程序在我的手机或模拟器上运行(使用eclipse),我就无法进行任何异常故障排除。知道这一点实际上可以节省我很多时间,但直到现在我都不好意思问:)。既然这件事让我发疯了,我想是时候放下我的骄傲,把它弄清楚了。耶,我找到了罪魁祸首,而且它工作得很好。我仍然想知道如何从模拟器捕获和查看异常。再次感谢你的帮助Lirik。我已经把线程的东西注释掉了,我只是把它包含在我的代码中,以表明我已经尝试过了。在任何情况下,您的代码执行与我以前相同的操作,它工作2次,然后应用程序强制关闭。我现在尝试了其他3个方法(handler.postdayed,从调用方法传递runnable和handler等),每个人都有相同的结果…它工作两次,然后失败。还有其他想法吗?结果是有其他原因导致它强制关闭(与此相关)。我是根据从套接字中得到的结果来显示的,我猜我编写的套接字类中的线程在这里是冲突的……我不确定,但是当我从等式中去掉这个时,您的代码工作得很好。所以我想我需要回到绘图板上,找到另一种调用showHands()方法的方法:/谢谢你的帮助。@Kyle,你得到了什么异常?我不确定。它只是强制关闭应用程序。有没有办法将异常记录到某个地方?(我意识到这是一个非常生疏的问题,我提前为我的提问道歉)。一旦应用程序在我的手机或模拟器上运行(使用eclipse),我就无法进行任何异常故障排除。知道这一点实际上可以节省我很多时间,但直到现在我都不好意思问:)。既然这件事让我发疯了,我想是时候放下我的骄傲,把它弄清楚了。耶,我找到了罪魁祸首,而且它工作得很好。我仍然想知道如何从模拟器捕获和查看异常。再次感谢你的帮助Lirik。