我需要在某个时间间隔到期后与服务器定期同步一些数据。而且,当然,我需要异步执行此操作。但是有时候我需要同步数据而没有等待间隔。而且我还需要每个下一个“同步过程”在每个先前的过程之后之后开始。 不可能同时执行两个过程。为此,我有一些实现方法。我的想法是使用流和列表。
我在某些管理类中具有已注册侦听器的流。当指定的时间间隔到期时,我只需调用方法manager.AddAsyncTask
即可将任务放入流中。侦听器从流中获取任务并对其进行处理。 Task是使用方法run
的同步类的实例。代码示例:
class SyncManager
final _task = StreamController<task>.broadcast();
final _tasks = List<Task>[];
void addTaskAsync(Task task) {
_task.add(task); // send task to stream
}
void addTaskSync(Task task) async {
_tasks.add(task); // add tasks to list
if (_tasks.isNotEmpty) {
await run();
}
}
SyncManager() {
_task.listen((task) {
if (task.isSynchronous) {
return;
}
task.sync.run(forced: task.forced)
.then((done) {
if (done) {
// do some staff
}
});
});
}
对于“一次”任务,我调用manager.AddSyncTask
并将这些任务放入列表中。使用while
循环同步处理此列表,这似乎是一个问题,因为有时该循环永远不会结束并且GUI线程已锁定。 :(
void run() async {
while (_tasks.isNotEmpty) {
final task = _tasks.first;
final done = await task.sync.run(forced: task.forced);
if (done) {
// do other staff
}
}
}
我仍然看到使用流来实现我的要求,但是我无法弄清楚事情并解决难题。说到非Flutter编程的术语,我需要有一种可能在单独的“线程”中处理一些固定的进程,以不阻塞GUI。
您能提出任何建议吗?