這很難。常規ExecutorService
沒有Looper
,在這樣的線程中不能有Handler
。
A Looper
是一個無限循環,可以將隊列出隊並執行事件。所以如果你安排你的執行者被阻止。你可以基於Looper的事件處理來實現你自己的執行器,但我想這不是你想要的。
要從後臺使用傳感器,您需要創建HandlerThread
。這是一個運行Looper的後臺線程,因此它可以有一個Handler
。
小例子
private HandlerThread mHandlerThread;
private Handler mBackgroundHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandlerThread = new HandlerThread("SomeNameHere");
mHandlerThread.start();
mBackgroundHandler = new Handler(mHandlerThread.getLooper());
mBackgroundHandler.post(new Runnable() {
@Override
public void run() {
// I can do blocking network here.
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
mHandlerThread.quitSafely();
}
好這就是我最終做的。每10秒我想爲SensorEvenListener記錄2秒鐘的樣本。我最終制作了一個HandlerThread並獲得了一個參考。到其處理程序並在註冊期間將其傳遞到SensorManager。 HandlerThread然後接收回調事件並將這些值添加到列表中。我保留了Scheduled ExecutorService,每10秒鐘運行一次可以註冊傳感器事件的runnable,休眠2秒鐘(在這段時間內HandlerThread隊列中的值),然後喚醒傳感器事件的取消註冊並在db中緩存值。謝謝! – neonDion