问题描述
我想每 30 秒更新一次应用程序 MainActivity 中的某些元素。我只需要在 MainActivity 有焦点时才会发生这种情况,所以一旦我更改活动或关闭应用程序,这个周期性任务应该停止。
我曾尝试使用带有 Runnable 和递归 postDelayed
的处理程序,但我一直遇到 runnable 不停止、多个同时运行等问题。
我什至不确定这是否是我应该使用的方式来实现想要的功能,所以在这里我问是否有人做过类似的事情并且可以分享他实现这一目标的方式。
附注。我正在用 Java 编写我的应用程序。
谢谢
解决方法
我不知道我的方式是否理想。无论如何,我喜欢这样:
private static final long TIMER_INTERVAL = 30000L;
private Timer mTimer;
@Override
public void onResume() {
super.onResume();
resumeTimer();
}
@Override
public void onPause() {
pauseTimer();
super.onPause();
}
private void resumeTimer() {
pauseTimer(); // To avoid multiple occurrences,// at first cancel existing timer if any
mTimer = new Timer();
mTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// do your periodic task
}
},TIMER_INTERVAL);
}
private void pauseTimer() {
if (mTimer != null) { // cancel existing timer if any
mTimer.cancel();
mTimer = null;
}
}
[修改] Handler 的替代方案:
private static final long TIMER_INTERVAL = 30000L;
private Handler mHandler;
private Runnable mRunnable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler = new Handler();
mRunnable = new Runnable() {
@Override
public void run() {
// do your periodic task
mHandler.postDelayed(mRunnable,TIMER_INTERVAL);
}
};
}
@Override
public void onResume() {
super.onResume();
resumeHandler();
}
@Override
public void onPause() {
pauseHandler();
super.onPause();
}
private void resumeHandler() {
pauseHandler(); // To avoid multiple occurrences,// at first cancel existing task if any
mHandler.post(mRunnable);
}
private void pauseHandler() {
mHandler.removeCallbacks(mRunnable);
}
,
Handler handler = new Handler(Looper.getMainLooper());
Runnable runnable = new Runnable() {
@Override
public void run() {
//do something here
handler.postDelayed(this,30000);
}
};
,
首先:请发布您的代码和日志!
如果您只想在布局中进行无限操作,请使用处理程序,并在所需的 Activity 中调用它。
记得在runnable的声明里面调用postDealyed,在自己外面调用Runnable#start()