##要点
- 是否熟练编写异步和同步的代码(中级)
- 是否熟悉回调地狱(中级)
- 是否能够熟练使用RxJava(中级)
- 是否对Kotlin协程有了解(高级)
- 是否具备编写良好的代码的意识和能力(高级)
##什么是异步?
即,代码并不是按照 编写的顺序 去 顺序执行 的,
如下面便是异步程序,执行完sendMsg()之后,
直接就跑到倒数第三行的分号那里了,
中间的回调方法onMsgReturned()没有马上被执行,
而是等到数据请求完毕,服务器成功返回的时候才执行,
即没有按照编写顺序执行代码,为异步代码:
代码来自__Android | UDP的C(Java|Android)/S(Java)通信实战案例(简易聊天室),
详情请点击前往~
mBtnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String msg = mEtMsg.getText().toString();
if (TextUtils.isEmpty(msg)) {
return;
}
appendMsgToContent("client:" + msg);
//发送后清除编辑框文本
mEtMsg.setText("");
mUdpClientBiz.sendMsg(msg, new UdpClientBiz.onMsgReturnedListener() {
@Override
public void onMsgReturned(String msg) {
//更新UI
appendMsgToContent("server:" + msg);
}
@Override
public void onError(Exception ex) {
ex.printStackTrace();
}
});
}
});
异步也不一定 要有多个线程!同一个线程中也可以异步, 如上面案例中,onClick()编写完毕后,也不是马上被执行的, 需要等到button被点击的时候,onClick()才会被触发并执行,这也是异步代码! 同时,setOnClickListener()的调用以及onClick()的触发, 都是在同一个线程中完成的, 所以这是(只有一个线程的)同一个线程中的`异步代码``;
异步和同步,主要是取决于代码是否顺序执行, 否,则异步;
##异步的目的是什么 这里补充一下 CPU密集型、IO密集型的概念
-
提高CPU利用率!!! 适合于 需要用 更多的CPU占用 来 降低IO的负担 的情景, 就是CPU相对占用低,IO相对占用高的情景, 即
IO密集型程序! -
提升GUI程序的响应速度 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口) 是指采用图形方式显示的计算机操作用户界面。
注意一个前提: 要注意程序是IO密集型的还是CPU密集型的,CPU密集型的话,那无论是异步也好,高并发也好, 往往会降低CPU的利用率, 因为切换线程的时候会有一些开销!!! 并且这种场景需要的是, 提高IO利用率 来分担 CPU压力, 而不是使用背道而驰的异步方案!! ; 这里可以了解一下并行流
IO密集型的就可以提高CPU利用率, 因为IO操作往往会阻塞, 而异步代码实现,可以解救阻塞的困境! 用 更多的CPU占用 来 降低IO的负担; -
异步不一定快! 如上, 要看是什么类型的程序和场景。
##回调地狱
- 像上面图中的代码, 产生
过多层的回调嵌套的现象,称之“回调地狱”; 其实onSuccess中操作无非是想要切回主线程去更新UI, 这种的话, 其实可以在sendRequest中完成“切回主线程”的任务的, 在sendRequest的编写中, 使用一个绑定了MainLooper的Handler,把操作切回主线程进行即可, 调用的话可以使用new Callback()这里的接口参数去抽象调用; 类似的可以参考一下笔者的博客,如 Android | UDP的C(Java|Android)/S(Java)通信实战案例中的UdpClientBiz.class或者 Android | TCP的C(Java|Android)/S(Java)通信实战经典聊天室案例中的TcpClientBiz; 避免产生 如上图中的过多层的回调嵌套!!!;
- 或者使用
Rxjava, 亦可解决回调地狱问题;
###RxJava(3:40 -- 10:48) ###Kotlin协程(10:49 -- 14:44)