运行 仅在 MainActivity 具有焦点时每 30 秒执行一次任务

Run task every 30 seconds only while MainActivity has focus

我想每 30 秒更新一次应用的 MainActivity 中的一些元素。我只需要在 MainActivity 获得焦点时发生这种情况,所以一旦我更改活动或关闭应用程序,这个周期性任务就应该停止。

我已经尝试使用具有 Runnable 和递归的处理程序 postDelayed 但我一直遇到 runnables 不停止、多个 运行 同时出现等问题

我什至不确定这是否是我应该用于实现所需功能的方式,所以在这里我想问问是否有人做过类似的事情并可以分享他实现此目的的方式。

PS。我正在 Java.

中编写我的应用程序
Handler handler = new Handler(Looper.getMainLooper());
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                
                //do something here
                
                handler.postDelayed(this, 30000);
            }
        };

不知道我的方法是否理想。无论如何,我喜欢这样:

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

        }
    }, 0, 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);
}

首先:请post你的代码和日志!

当你只想在布局中进行无限操作时,使用处理程序,在 Activity 中调用它。

记得在 runnable 的声明中调用 postDealyed 并在其自身之外调用 Runnable#start()