Android LifecycleObserver & ScheduledThreadPoolExecutor使用者可見時每隔3秒週期更新,使用者不可見時暫停週期更新
阿新 • • 發佈:2018-12-09
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