Android(Java)---一起交流一下优雅编写异步代码

106 阅读3分钟

##要点

  • 是否熟练编写异步和同步的代码(中级)
  • 是否熟悉回调地狱(中级)
  • 是否能够熟练使用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的负担;

  • 异步不一定快! 如上, 要看是什么类型的程序和场景。

##回调地狱

  • 或者使用Rxjava, 亦可解决回调地狱问题;

###RxJava(3:40 -- 10:48) ###Kotlin协程(10:49 -- 14:44)