首页 > 其他分享 >AsyncTask和IntentService在Flutter中等价于什么

AsyncTask和IntentService在Flutter中等价于什么

时间:2022-12-01 13:39:09浏览次数:69  
标签:sendPort IntentService port ReceivePort AsyncTask msg new Flutter


AsyncTask和IntentService在Flutter中等价于什么
在Android中,当你想访问一个网络资源时,你通常会创建一个AsyncTask,它将在UI线程之外运行代码来防止你的UI被阻塞。 AsyncTask有一个线程池,可以为你管理线程。

由于Flutter是单线程的,运行一个事件循环(如Node.js),所以您不必担心线程管理或者使用AsyncTasks、IntentServices。

要异步运行代码,可以将函数声明为异步函数,并在该函数中等待这个耗时任务

loadData() async {
String dataURL = "https://jsonplaceholder.typicode.com/posts";
http.Response response = await http.get(dataURL);
setState(() {
widgets = JSON.decode(response.body);
});
}

这就是典型的进行网络或数据库调用的方式

在Android上,当您继承AsyncTask时,通常会覆盖3个方法,OnPreExecute、doInBackground和onPostExecute。 在Flutter中没有这种模式的等价物,因为您只需等待一个长时间运行的函数,而Dart的事件循环将负责其余的事情。

但是,有时您可能需要处理大量数据,导致UI可能会挂起。

在这种情况下,与AsyncTask一样,在Flutter中,可以利用多个CPU内核来执行耗时或计算密集型任务。这是通过使用Isolates来完成的。

是一个独立的执行线程,它运行时不会与主线程共享任何内存。这意味着你不能从该线程访问变量或通过调用setState来更新你的UI。

我们来看一个简单的Isolate的例子,以及如何与主线程通信和共享数据以更新UI:

loadData() async {
ReceivePort receivePort = new ReceivePort();
await Isolate.spawn(dataLoader, receivePort.sendPort);

// The 'echo' isolate sends it's SendPort as the first message
SendPort sendPort = await receivePort.first;

List msg = await sendReceive(sendPort, "https://jsonplaceholder.typicode.com/posts");

setState(() {
widgets = msg;
});
}

// the entry point for the isolate
static dataLoader(SendPort sendPort) async {
// Open the ReceivePort for incoming messages.
ReceivePort port = new ReceivePort();

// Notify any other isolates what port this isolate listens to.
sendPort.send(port.sendPort);

await for (var msg in port) {
String data = msg[0];
SendPort replyTo = msg[1];

String dataURL = data;
http.Response response = await http.get(dataURL);
// Lots of JSON to parse
replyTo.send(JSON.decode(response.body));
}
}

Future sendReceive(SendPort port, msg) {
ReceivePort response = new ReceivePort();
port.send([msg, response.sendPort]);
return response.first;
}

“dataLoader”是在它自己的独立执行线程中运行的隔离区,您可以在其中执行CPU密集型任务,例如解析大于1万的JSON或执行计算密集型数学计算。

下面是一个可以运行的完整示例:

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:async';
import 'dart:isolate';

void main() {
runApp(new SampleApp());
}

class SampleApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Sample App',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new SampleAppPage(),
);
}
}

class SampleAppPage extends StatefulWidget {
SampleAppPage({Key key}) : super(key: key);

@override
_SampleAppPageState createState() => new _SampleAppPageState();
}

class _SampleAppPageState extends State<SampleAppPage> {
List widgets = [];

@override
void initState() {
super.initState();
loadData();
}

showLoadingDialog() {
if (widgets.length == 0) {
return true;
}

return false;
}

getBody() {
if (showLoadingDialog()) {
return getProgressDialog();
} else {
return getListView();
}
}

getProgressDialog() {
return new Center(child: new CircularProgressIndicator());
}

@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("Sample App"),
),
body: getBody());
}

ListView getListView() => new ListView.builder(
itemCount: widgets.length,
itemBuilder: (BuildContext context, int position) {
return getRow(position);
});

Widget getRow(int i) {
return new Padding(padding: new EdgeInsets.all(10.0), child: new Text("Row ${widgets[i]["title"]}"));
}

loadData() async {
ReceivePort receivePort = new ReceivePort();
await Isolate.spawn(dataLoader, receivePort.sendPort);

// The 'echo' isolate sends it's SendPort as the first message
SendPort sendPort = await receivePort.first;

List msg = await sendReceive(sendPort, "https://jsonplaceholder.typicode.com/posts");

setState(() {
widgets = msg;
});
}

// the entry point for the isolate
static dataLoader(SendPort sendPort) async {
// Open the ReceivePort for incoming messages.
ReceivePort port = new ReceivePort();

// Notify any other isolates what port this isolate listens to.
sendPort.send(port.sendPort);

await for (var msg in port) {
String data = msg[0];
SendPort replyTo = msg[1];

String dataURL = data;
http.Response response = await http.get(dataURL);
// Lots of JSON to parse
replyTo.send(JSON.decode(response.body));
}
}

Future sendReceive(SendPort port, msg) {
ReceivePort response = new ReceivePort();
port.send([msg, response.sendPort]);
return response.first;
}

}

您还可以看看下面的博客文章,回顾以前和继续学习,包含我在学习开发中遇到的难题等等

​​Flutter入门,学习历程,进入开发,在安卓手机运行起来​​Visual Studio code工具开发flutte总结
Flutter 跨平台开发 为什么选择Flutter
跨平台开发 为什么选择Flutter
Android 开发者 for Flutter (1)Flutter和Android中的View对比及如何更新widget
Android 开发者 for Flutter (2)如何布局? XML layout 文件跑哪去了?及布局中添加或删除组件
Android 开发者 for Flutter (3) flutter中动画是如何实现的 及 如何使用Canvas draw/paint
Flutter轮播图编写(两种方式)CarouselSlider和PageView(自动轮播,也可以手动左右拖拽)
flutter 中tabbar切换上下均可,banner轮播图,listview刷新添加更多,listview嵌套gridview
Flutter 项目编写 第三方插件库文件引入,本地图片 json数据引入解析
flutter run 运行项目 所遇到的问题总结(Scaffold加padding及 flutter/material.dart’;爆红问题解决;listview嵌套gridview滑动问题)
Flutter 中 如何构建自定义 Widgets
[安卓Intent在Flutter中等价于什么?及数据传输和startActivityForResult 在Flutter中等价于什么](javascript:void(0))
异步UI runOnUiThread 在Flutter中等价于什么

如对您有帮助,欢迎starts 谢谢。下面是我自己写的demo 可以看看 一块学习:

​项目源码github​

​感谢Flutter中文网​


标签:sendPort,IntentService,port,ReceivePort,AsyncTask,msg,new,Flutter
From: https://blog.51cto.com/u_15898516/5901791

相关文章

  • 异步UI runOnUiThread 在Flutter中等价于什么
    异步UIrunOnUiThread在Flutter中等价于什么Dart是单线程执行模型,支持Isolates(在另一个线程上运行Dart代码的方式)、事件循环和异步编程。除非您启动一个Isolate,否则您的Da......
  • Flutter-Dart(一)
    一.Dart介绍和安装1.1.认识DartGoogle为Flutter选择了Dart就已经是既定的事实,无论你多么想用你熟悉的语言,比如JavaScript、Java、Swift、C++等来开发Flutter,至少目前都......
  • 深入解析 Flutter 下一代渲染引擎 Impeller
    深入解析Flutter下一代渲染引擎Impeller原创字节跳动终端技术工作日志08/2411:49阅读数9.4K本文被收录于专区大前端进入专区参与更多专题讨论 ......
  • Flutter混合⼯程CI⾃动化使⽤流程
    接上一篇CI配置好后,怎样使用CI和Flutter模块引入iOS工程。⼀、新建Flutter编译产物仓库地址用于flutter编译好的framework上传地址⼆、修改脚本⽂件PROJECT_NAME:项⽬中......
  • iOS项目Flutter混合工程CI自动化配置
    CI整个流程简介:flutter项⽬源码仓库配置CI命令,配置runner与源码关联起来,flutter项⽬源码更新时,触发CI命令通过runner机器将flutter源码⽣成framework,然后通过git命令将⽣......
  • flutter使用getwidget的ui组件库的底部导航用法
    参考github上getwidget-app-kit import'package:flutter/material.dart';import'package:getwidget/getwidget.dart';import'package:flutter/cupertino.dart';......
  • The current Flutter SDK version is 0.0.0-unknown.
    参考:https://blog.csdn.net/phunxm/article/details/117316761   问题:安装插件的时候显示flutter的sdk版本不对,但实际上是没问题的ThecurrentFlutterSDKversi......
  • flutter 画一条曲线
    1、代码Container(width:50,height:50,child:CustomPaint(size:Size(50,50),painter:MyPainter(),isComplex:false,willChange:false......
  • app直播源码,flutter Text自动计算文本内容的宽度
    app直播源码,flutterText自动计算文本内容的宽度一、什么是TextPainter在内容开始之前,我们先来看一下它的属性 TextPainter({  InlineSpan?text,   //Tex......
  • 《Flutter实战入门》让Flutter学起来更轻松
    自从2018年Google发布Flutter第一个预览版以来,Flutter就受到了开发者的热捧,短短一年多的时间,Flutter在GitHub上就收获了8W+stars,版本发布的频率超乎想象。在StackOverflow......