关闭处理程序,删除回调

时间:2014-03-13 10:15:38

标签: java android activity-lifecycle android-handler

在我的应用中,我很少Activities。问题是,当我想要关闭一个应用程序时,我的一个活动不会终止,当我重新打开应用程序时,这个活动会被提起。

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

在此活动中,我使用Handler内的onTouchListener使用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终止之前不会停止?

3 个答案:

答案 0 :(得分:1)

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

handler.removeCallbacksAndMessages(null);

在removeCallbacksAndMessages的文档中,它说...... “删除所有待处理的回调帖子并发送其obj为令牌的邮件。如果令牌为空,则将删除所有回调和邮件。”

请参阅removeCallbacksAndMessages

的这篇文章

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

在removeCallbacksAndMessages中传递null,如

handler.removeCallbacksAndMessages(null);