Flutter的多线程(Isolate)和异步(async/aw
2019-10-10 本文已影响0人
王俏
怎么编写异步的代码
Dart有一个单线程执行模型,支持Isolate(一种在另一个线程上运行Dart代码的方法),一个事件循环和异步编程.除非自己创建一个Isolate,否则dart代码永远运行在主UI线程,
并由event loop驱动.Flutter的event loop 和IOS中的main loop相似:Looper是附加在主线程的.
Dart的单线程模型,并不意味着代码一定要作为阻塞操作的方式运行,从而卡住UI.相反,可以使用Dart语言提供的异步工具,例如async/await,来实现异步操作(编写网络请求代码/数据库访问,而不会挂起UI).
怎么把工作放到后台线程执行
由于Flutter是单线程并且跑着一个event loop,因此不必担心线程管理或生成后台线程.如果正在做I/O操作,如访问磁盘或网络请求,可以安全地使用async/await来完成.如果需要让CPU执行繁忙的计算密集型任务,需要使用Isolate来避免阻塞event loop.
Isolate是分离的运行线程,并且不和主线程的内存堆共享内存.这意味着不能访问主线程中的变量,或者使用setState()来更新UI.
isolate1.png isolate2.pngdataLoader()是一个运行于自己独立执行线程上的Isolate.在Isolate里,你可以执行CPU密集型任务(例如解析一个庞大的json,解析json也是很耗时的),或是计算密集型的数学操作,如加密或信号处理等