先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
正文
{*\expandedcolortbl;;}
\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0
\pard\tx566\tx1133\tx1700\tx2083\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\f0\fs24 \cf0 I love flutter —>文字内容
\f1 ;}
可以发现,先输出I love Android
,然后读取文件这种超时的操作会后执行,也就是读取文件内容是将来执行的,then
接收异步并打印出结果。注意:Future并不是并行执行的。
1.2.Future.catchError
当异步任务发生错误,可以在catchError
中捕获错误,例子如下:
Future.delayed(new Duration(seconds: 3),(){
throw AssertionError(“This is a Error”);
}).then((data){
//这是成功的逻辑
print(“success”);
}).catchError((e){
//失败会走到这里
print(e);
});
输出结果如下:
Assertion failed
可以发现,在异步任务中抛出了一个异常,then
的回调函数不会执行,反而catchError
函数被调用,当然并不是只有catchError
才能捕获错误,then
方法有一个可选的参数onError
,可以用它来捕获异常:
Future.delayed(new Duration(seconds: 3),(){
throw AssertionError(“This is a Error”);
}).then((data){
//这是成功的逻辑
print(“success”);
},onError:(e){
print(e);
});
输出结果:
Assertion failed
1.3.Future.whenComplete
有很多时候,当异步任务无论成功或者失败都需要做一些事的场景,如在网络请求前弹出加载进度框,在请求结束后关闭进度框,下面用whenComplete
进行回调,例子如下:
Future.delayed(new Duration(seconds: 3),(){
throw AssertionError(“This is a Error”);
}).then((data){
//这是成功的逻辑
print(“success”);
},onError:(e){
//这是失败的逻辑
print(e);
}).whenComplete((){
print(“无论失败,或者成功都会走到这”);
});
}
输出结果如下:
Assertion failed
无论失败,或者成功都会走到这
1.4.Future.wait
有时候,需要等待多个异步任务都执行结束后才进行一些操作,如有一个界面,需要从两个接口获取数据,获取成功后,将两个数据进行处理后显示在UI界面上,这时候,Future.wait
派出用上了,它接收一个Future
数组参数,只有数组中所有的Future
执行成功后,就会触发then
回调,当然,只要有一个Future
执行失败就会触发错误回调,下面实现一下当两个异步任务都执行成功时,将结果打印出来:
Future.wait([
//3秒后返回结果
Future.delayed(new Duration(seconds: 3),(){
return “Android”;
}),
//4秒后返回结果
Future.delayed(new Duration(seconds: 4),(){
return " And Future";
})
]).then((data){
//成功逻辑
print(data[0] + data[1]);
}).catchError((e){
//捕捉错误
print(e);
});
}
输出结果如下:
Android And Future
可以看到当两个异步任务完成才会回调then
函数。
2.Async/await
使用Async/await
也是可以实现异步操作,下面直接上例子:
main() {
create();
}
void create(){
String data = getData();
print(data);
print(“I love Future”);
}
getData() async{
return await “I love Android”;
}
运行上面代码,报错了:
type ‘Future’ is not a subtype of type ‘String’
报的是类型不匹配?为什么呢?经过一番搜查,发现getData
是一个异步操作函数,它的返回值是一个await
延迟执行的结果。在Dart
中,有await
标记的运算,其结果值是一个Future
对象,Future
并不是String类型,就报错了。那么怎么才正确获得异步的结果呢?Dart规定async标记的函数,只能由await来调用,下面改成这样:
main() {
create();
}
void create() async{
String data = await getData();
print(data);
print(“I love Future”);
}
getData() async{
return await “I love Android”;
}
下面直接去掉async
函数包装,直接在getData
方法里对data
进行赋值:
String data;
main() {
create();
}
void create(){
getData();
print(“I love Future”);
}
getData() async{
data = await “I love Android”;
print(data);
}
上面输出结果是:
I love Future
I love Android
可以发现,先输出的是I love Future
后面再输出I love Android
,可以发现当函数被async
修饰时,会先去执行下面的操作,当下面的操作执行完,然后再执行被async
修饰的方法。async
用来表示函数是异步的,定义的函数会返回一个Future
对象,await
后面是一个Future
,表示等待该异步任务完成,异步完成后才会往下走。要注意以下几点:
- await关键字必须在async函数内部使用,也就是加await不加async会报错。
- 调用async函数必须使用await关键字,如果加async不加await会顺序执行代码。
下面再上例子:
main() {
_startMethod();
_method_C();
}
_startMethod() async{
_method_A();
await _method_B();
print(“start结束”);
}
_method_A(){
print(“A开始执行这个方法~”);
}
_method_B() async {
print(“B开始执行这个方法~”);
await print(“后面执行这句话~”);
print(“继续执行这句哈11111~”);
}
_method_C(){
print(“C开始”);
}
结果如下:
A开始执行这个方法~
B开始执行这个方法~
后面执行这句话~
C开始
继续执行这句哈11111~
start结束
- 当使用async作为方法名后缀声明时,说明这个方法的返回值是一个Future;
- 当执行到该方法代码用await关键字标注时,会暂停该方法其他部分执行;
- 当await关键字引用的Future执行完成,下一行代码会立即执行。
也就是首先执行_startMethod
这个方法用async声明了,因为方法里调用了_method_A
,所以先输出print(“A开始执行这个方法~”);,后面执行_method_B()
,这个方法用await关