在我的应用中,我很少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终止之前不会停止?
答案 0 :(得分:1)
根据我的经验,这称之为很有效!
handler.removeCallbacksAndMessages(null);
在removeCallbacksAndMessages的文档中,它说...... “删除所有待处理的回调帖子并发送其obj为令牌的邮件。如果令牌为空,则将删除所有回调和邮件。”
的这篇文章答案 1 :(得分:1)
你的问题很奇怪。主线程(我认为你称之为Handler线程)将运行,直到你的应用程序完全被破坏。 Hander不是一个主题。它是消息队列的接口,例如由某个线程发送。
您的问题是您从错误的处理程序中删除Runnable。每次创建一个新的Handler(matchHandler = new Handler())。每个处理程序都有自己的待处理runnables队列。所以你创建了新的处理程序并添加了runnable。然后你创建另一个处理程序并删除runnable(显然没有一个,因为它是另一个处理程序)。您应该只创建一个处理程序,并从中添加和删除runnables。
答案 2 :(得分:0)
在removeCallbacksAndMessages中传递null,如
handler.removeCallbacksAndMessages(null);