1. 程式人生 > >Android LifecycleObserver & ScheduledThreadPoolExecutor使用者可見時每隔3秒週期更新,使用者不可見時暫停週期更新

Android LifecycleObserver & ScheduledThreadPoolExecutor使用者可見時每隔3秒週期更新,使用者不可見時暫停週期更新

Android LifecycleObserver & ScheduledThreadPoolExecutor使用者可見時每隔3秒週期更新,不可見時暫停每隔3秒的週期更新

簡言之,當用戶按home鍵把當前App切換至“後臺”不可見時候(使用者看不見當前App頁面時候),暫停每隔3秒的週期更新操作。當用戶又將App切換至前臺,使用者看到App頁面時候,重啟每隔3秒的週期性更新。關鍵是通過LifecycleObserver使用ScheduledThreadPoolExecutor的scheduleAtFixedRate實現。

package zhangphil.test;

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.LifecycleRegistry;
import android.arch.lifecycle.OnLifecycleEvent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class LiveActivity extends AppCompatActivity {
    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        System.out.println("onCreate");

        MyLifecycleObserver mLifecycleObserver = new MyLifecycleObserver();
        getLifecycle().addObserver(mLifecycleObserver);
    }

    @Override
    protected void onResume() {
        super.onResume();
        System.out.println("onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        System.out.println("onPause");
    }

    @Override
    public LifecycleRegistry getLifecycle() {
        return mLifecycleRegistry;
    }

    public class MyLifecycleObserver implements LifecycleObserver {
        private UpdateThread mUpdateThread;

        public MyLifecycleObserver() {
            mUpdateThread = new UpdateThread();
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
        public void on_create() {
            System.out.println("Lifecycle.Event.ON_CREATE");
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
        public void on_resume() {
            System.out.println("Lifecycle.Event.ON_RESUME");
            mUpdateThread.startUpdate();
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
        public void on_pause() {
            System.out.println("Lifecycle.Event.ON_PAUSE");
            mUpdateThread.stopUpdate();
        }
    }

    private class UpdateThread extends Thread {
        private ScheduledThreadPoolExecutor mScheduledThreadPoolExecutor = null;
        private Runnable mRunnable = null;
        private ScheduledFuture<?> mScheduledFuture = null;

        public UpdateThread() {
            mScheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
            mRunnable = new Runnable() {
                @Override
                public void run() {
                    updateAction();
                }
            };
        }

        public void startUpdate() {
            //每隔3秒週期性的執行更新動作。
            mScheduledFuture = mScheduledThreadPoolExecutor.scheduleAtFixedRate(mRunnable, 0, 3, TimeUnit.SECONDS);
        }

        public void stopUpdate() {
            mScheduledFuture.cancel(true);
        }
    }

    /**
     * 從遠端伺服器開始更新資料到本地的動作。
     */
    private void updateAction() {
        System.out.println(Thread.currentThread().getName() + " 從遠端伺服器更新資料...");
    }
}

 

輸出:

2018-11-12 18:59:17.041 16218-16218/? I/System.out: onCreate
2018-11-12 18:59:17.047 16218-16218/? I/System.out: Lifecycle.Event.ON_CREATE
2018-11-12 18:59:17.188 16218-16218/? I/System.out: onResume
2018-11-12 18:59:17.188 16218-16218/? I/System.out: Lifecycle.Event.ON_RESUME
2018-11-12 18:59:17.191 16218-16241/? I/System.out: pool-1-thread-1 從遠端伺服器更新資料...
2018-11-12 18:59:20.189 16218-16241/zhangphil.test I/System.out: pool-1-thread-1 從遠端伺服器更新資料...
2018-11-12 18:59:23.191 16218-16241/zhangphil.test I/System.out: pool-1-thread-1 從遠端伺服器更新資料...
2018-11-12 18:59:24.970 16218-16218/zhangphil.test I/System.out: Lifecycle.Event.ON_PAUSE
2018-11-12 18:59:24.970 16218-16218/zhangphil.test I/System.out: onPause
2018-11-12 18:59:47.126 16218-16218/zhangphil.test I/System.out: onResume
2018-11-12 18:59:47.127 16218-16218/zhangphil.test I/System.out: Lifecycle.Event.ON_RESUME
2018-11-12 18:59:47.128 16218-16241/zhangphil.test I/System.out: pool-1-thread-1 從遠端伺服器更新資料...
2018-11-12 18:59:50.128 16218-16241/zhangphil.test I/System.out: pool-1-thread-1 從遠端伺服器更新資料...
2018-11-12 18:59:53.128 16218-16241/zhangphil.test I/System.out: pool-1-thread-1 從遠端伺服器更新資料...
2018-11-12 18:59:55.211 16218-16218/zhangphil.test I/System.out: Lifecycle.Event.ON_PAUSE
2018-11-12 18:59:55.211 16218-16218/zhangphil.test I/System.out: onPause