如何异步实施顺序过程(不影响GUI?

时间:2019-06-24 08:25:40

标签: asynchronous flutter

我需要在某个时间间隔到期后与服务器定期同步一些数据。而且,当然,我需要异步执行此操作。但是有时候我需要同步数据而没有等待间隔。而且我还需要每个下一个“同步过程”在每个先前的过程之后之后开始。 不可能同时执行两个过程。为此,我有一些实现方法。我的想法是使用流和列表。

  1. 我在某些管理类中具有已注册侦听器的流。当指定的时间间隔到期时,我只需调用方法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
              }
            });
       });
    

    }

  2. 对于“一次”任务,我调用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。

您能提出任何建议吗?

0 个答案:

没有答案