Closed sc00n closed 5 months ago
It's because the background task executor is never stopped again, and hence cannot be started when already started:
[log] [CAMS INFO] Starting BackgroundTaskExecutor [1007518798] (started)
[log] [CAMS WARNING] Trying to start a BackgroundTaskExecutor but it is already started. Ignoring this.
So - I guess this comes down to semantics; what do we want to happen if we start a task that is already started?
Maybe restart the task? For me the important thing is that we can do something periodically, such as getting a device/weather measurement.
A way to solve it is to add a duration to the task so it stops automatically after a while:
protocol.addTaskControl(
PeriodicTrigger(period: const Duration(seconds: 5)),
BackgroundTask(duration: const IsoDuration(seconds: 2), measures: [
Measure(type: DeviceSamplingPackage.DEVICE_INFORMATION)
]),
phone);
But - there are a couple of issues with this too:
using an IsoDuration
instead of a regular Dart Duration
class seems strange (from a Dart API point-of-view)
using a BackgroundTask
for this kind of "on-time" measures seems like a bad design
The issue is that measures both comes as one-time and event-based measures. And the Task
controlling the measures needs to be know this - somehow. In this case the DEVICE_INFORMATION
is a one-time measure but it is controlled by a BackgroundTask
that runs until stopped.
So - will try to address this.
carp_core 1.5.0 released solving item 1 above. Now you can write:
protocol.addTaskControl(
PeriodicTrigger(period: const Duration(seconds: 5)),
BackgroundTask(duration: const Duration(seconds: 2), measures: [
Measure(type: DeviceSamplingPackage.DEVICE_INFORMATION)
]),
phone);
Anyway - another issue is that according to the definition of a BackgroundTask
:
The task runs for the specified [duration], or until stopped, or until all measures and/or outputs have completed.
So - I guess that the implementation of the BackgroundTaskExecutor
does not comply to this contract.
When I use a periodic trigger, for device info or weather, it only works once.
Code:
output:
As you can see it only once actually got the device info. Its the same for weather (where a periodic trigger is actually useful).
This was tested on iOS with
but I also had the problem with previous versions of carp_mobile_sensing (e.g. 1.4.7).
The problem is the same for Android (only the second entry is an actual entry)
I don't have the problem with PeriodicSamplingConfiguration.