【问题标题】:Closing Handler, removing callbacks关闭处理程序,删除回调
【发布时间】:2014-03-13 10:15:37
【问题描述】:

在我的应用程序中,Activities 很少。问题是当我想关闭一个应用程序时,我的一个活动不会终止,而当我重新打开应用程序时,这个活动会首先出现。

就我而言,这可能是使用Handler 的问题。

在此活动中,我使用onTouchListener 中的Handler 旋转图像,同时使用Runnable,同时按下按钮。释放按钮后,我删除回调并调用另一个方法来启动下一个活动。

    public void ListenTo(){
    MatchTime.setOnTouchListener(new OnTouchListener(){
        long time_start=0;
        long time_end=0;

        @Override
        public boolean onTouch(View view, MotionEvent event) {

            matchHandler = new Handler();
            if (event.getAction() == MotionEvent.ACTION_DOWN ) {                
                time_start=System.currentTimeMillis();
                matchHandler.post(matchAction);
                return true;
            }
            if (event.getAction() == MotionEvent.ACTION_UP ) {                  
                time_end=System.currentTimeMillis();
                long TimeCounted=time_end-time_start;
                matchHandler.removeCallbacks(matchAction);
                matchHandler = null;
                SaveAndSend(TimeCounted);
                return true;
            }
            return false;
        }
        Runnable matchAction = new Runnable() {
            @Override public void run() {
                Face = (ImageView) findViewById(R.id.MatchTimeImage);
                Face.setRotation(Face.getRotation()+9);                     
                matchHandler.postDelayed(this, 25);
            }
        };
    });
}

我的问题是:

Handler 线程在 Android 自行终止之前不会停止,我做错了什么?

【问题讨论】:

    标签: java android activity-lifecycle android-handler


    【解决方案1】:

    根据我的经验,这很有效!

    handler.removeCallbacksAndMessages(null);
    

    在 removeCallbacksAndMessages 的文档中它说... "删除所有待处理的回调和发送消息,其 obj 为 token。如果 token 为空,所有回调和消息将被删除。"

    查看removeCallbacksAndMessages这个帖子

    【讨论】:

      【解决方案2】:

      你的问题很奇怪。主线程(我认为您将其称为 Handler 线程)将一直运行,直到您的应用程序被完全销毁。 Hander 不是线程。它是消息队列的接口,例如由某个线程发送。

      您的问题是您从错误的处理程序中删除了 Runnable。每次创建一个新的 Handler (matchHandler = new Handler())。每个处理程序都有自己的待处理可运行对象队列。因此,您创建新的处理程序并添加可运行的。然后您创建另一个处理程序并删除可运行的(显然没有,因为它是另一个处理程序)。您应该只创建一个处理程序并从中添加和删除可运行文件。

      【讨论】:

      • 你是对的,我的问题不正确。我想知道的是我应该在哪里/如何一劳永逸地创建这个处理程序?我将 matchHandler = new Handler() 移至 onCreate 并得到与以前相同的结果。
      • 也许你设置了几次 Listener?每次创建新侦听器时,都会创建新的 matchAction。我看不到你所有的代码。但是,如果您使用相同的处理程序和可运行实例 post 和 removeCallbacks 应该可以工作。
      【解决方案3】:

      像这样在 removeCallbacksAndMessages 中传递 null

      handler.removeCallbacksAndMessages(null);
      

      【讨论】:

        猜你喜欢
        • 2012-01-13
        • 1970-01-01
        • 1970-01-01
        • 2011-08-18
        • 2019-09-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        相关资源
        最近更新 更多