Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 3秒后取消对话框-多次使用后继续崩溃我的应用程序_Android_Multithreading_Dialog_Timer - Fatal编程技术网

Android 3秒后取消对话框-多次使用后继续崩溃我的应用程序

Android 3秒后取消对话框-多次使用后继续崩溃我的应用程序,android,multithreading,dialog,timer,Android,Multithreading,Dialog,Timer,我有一个扩展的对话类,我想显示3秒钟,然后消失。这在前两次调用时效果很好,但之后它会使我的应用程序崩溃。诚然,我不是线程方面的佼佼者,我想这就是我的问题所在。正如您可以从下面的代码(注释掉的部分)中看到的,我尝试使用取消事件来终止生成的线程,但这会使它在第一次运行时崩溃。我还尝试在父类的UI线程上执行所有这些操作,结果与此相同(显示对话框3次后崩溃) 当收到onCancel事件时,您正在调用t.destroy(),destroy是一种不推荐使用的方法 如果您正在创建一个已经异步运行的计时器,则不

我有一个扩展的对话类,我想显示3秒钟,然后消失。这在前两次调用时效果很好,但之后它会使我的应用程序崩溃。诚然,我不是线程方面的佼佼者,我想这就是我的问题所在。正如您可以从下面的代码(注释掉的部分)中看到的,我尝试使用取消事件来终止生成的线程,但这会使它在第一次运行时崩溃。我还尝试在父类的UI线程上执行所有这些操作,结果与此相同(显示对话框3次后崩溃)

  • 当收到
    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。