zoukankan      html  css  js  c++  java
  • Async分析

    参考自; https://blog.csdn.net/sinat_34657451/article/details/51345076

                https://www.sogou.com/link?url=DSOYnZeCC_owkDvmYG0gMz-JrNZwwuWK6LNfQ-_Y2qaT0w_ZK3DyxWnX3GxzhcOeSRHMCB52SpGsdxIQn3wm5NtXStYSoF7Yri2jTBr9OJ8.

    1.AsyncTask: 即asynchronous task,异步任务。AsyncTask实际上是围绕Thread和Handler设计的一个辅助类,在内部是对Thread和Handler的一种封装。AsyncTask的异步体现在由后台线程进行运算(访问网络等比较耗时的操作),然后将结果发布到用户界面上来更新UI,使用AsyncTask使得我不用操作Thread和Handler。

    2. AsyncTask的简单使用

         new AsyncTask<String,String,String>(){ 

        // 运行在主线程中,做预备工作//

             onPreExecute(){ } 

       // 运行在子线程中,做耗时操作//

            String doingBackGround(String s){ } 

       // 运行在主线程中,耗时操作完成,更新UI //

            onPostExecute(String s){ } 

        }.execute(String); 

     AsyncTask用法比较简单,Google设计这个类就是为了方便我们进行类似Handler这样的异步操作。

     如上代码,一般使用AsyncTask只要重写里面的三个方法,onPreExecute和onPostExecute不是抽象方法,不是必须实现,实现这两种方法一般能让代码的逻辑更加清晰。onPreExecute运行在主线程中,做一些准备工作。onPostExecute同样运行在主线程中,用于在耗时操作完成后,更新UI。

    另外,还有一个onProgressUpdate方法,用于在后台任务执行过程中来实时地更新UI。doingBackGround则是抽象方法,必须实现,我们使用AsyncTask时希望将一些耗时操作放在子线程中,doingBackGround中逻辑就相当于我们在Thread-Handler中Thread中的run方法中实现的逻辑。

    execute方法用于启动执行任务

    同步与异步的区别:在于请求的内容是不是立刻返回,同步请求需要等待结果返回后才能继续执行。单线程的执行的时候,需要顺序执行,如果碰到一个计算量很大,很耗时的函数需要执行,该线程就必须在这里等待结果计算出来以后,才能继续执行。

    异步请求理论上不需要等待请求的结果,将耗时的计算交给另外一个线程,在结果计算完成后会通知主线程。实际上,异步请求会立刻得到一个临时结果,然后异步请求就可以继续执行了,当异步线程返回真正结果后再通知主线程,然后主线程在做出动作。

    使用AsyncContext对象之前,在web.xml要加入如下标签(Servlet相同):

     [html] view plain copy

    1. <filter>  
    2.        <filter-name>ForwardFilter</filter-name>  
    3.        <filter-class>Async.AsyncFilter</filter-class>  
    4.        <async-supported>true</async-supported>  
    5.  </filter>  

     在Servlet 3.0中,在ServletRequest上提供了startAsync()方法,多次调用startAsync()返回的是同一个AsyncContext对象。

    startAsync()方法有参无参的区别是什么呢?

    ① 没有参数,HttpServletRequest.getRequestURI()返回URI就是dispatch()派发的URL。因为转向不会修改request,getRequestURI()返回最初的URI。

    ② 含有参数:dispatch()使用的是上一个派发器中URI参数。

    [java] view plain copy
    1. <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><p></p><pre name="code" class="java">AsyncContext startAsync() throwsjava.lang.IllegalStateException;  
    2. AsyncContext startAsync(ServletRequestservletRequest,  
    3.                         ServletResponseservletResponse)  
    4.                         throwsjava.lang.IllegalStateException  
    5. void   dispatch()  
    6. void   dispatch(ServletContext context, String path)  
    7. void   dispatch(String path)   
    [java] view plain copy
    1. // Thefollowing sequence illustrates how this will work:  
    2.   
    3. // REQUEST dispatch to /url/A  
    4.   
    5.  AsyncContext ac = request.startAsync();  
    6.   
    7.  ...  
    8.   
    9.  ac.dispatch(); // ASYNC dispatch to /url/A  
    10.   
    11.    
    12.   
    13.  // REQUEST to /url/A  
    14.   
    15.  // FORWARD dispatch to /url/B  
    16.   
    17.  request.getRequestDispatcher("/url/B").forward(request,response);  
    18.   
    19.  // Start async operation from within the target of the FORWARD  
    20.   
    21.  // dispatch  
    22.   
    23.  ac = request.startAsync();  
    24.   
    25.  ...  
    26.   
    27.  ac.dispatch(); // ASYNC dispatch to /url/A  
    28.   
    29.    
    30.   
    31.  // REQUEST to /url/A  
    32.   
    33.  // FORWARD dispatch to /url/B  
    34.   
    35.  request.getRequestDispatcher("/url/B").forward(request,response);  
    36.   
    37.  // Start async operation from within thetarget of the FORWARD  
    38.   
    39.  // dispatch  
    40.   
    41.  ac = request.startAsync(request,response);  
    42.   
    43.  ...  
    44.   
    45.  ac.dispatch(); // ASYNC dispatch to /url/B  
    [java] view plain copy
    1. <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">AsyncListener对象是用来对AsyncContext对象动作进行监听,使用下面的方法为一个AsyncContext添加一个或者多个Listener。</span>  
    [java] view plain copy
    1. AsyncContext.addListener(AsyncListener listener)  

    监听的方法有四个:

    [java] view plain copy
      1. public interface AsyncListenerextends EventListener {  
      2.    void onComplete(AsyncEvent event) throws IOException;  
      3.    void onTimeout(AsyncEvent event) throws IOException;  
      4.    void onError(AsyncEvent event) throws IOException;  
      5.    void onStartAsync(AsyncEvent event) throws IOException;  
  • 相关阅读:
    The Python Standard Library
    Python 中的round函数
    Python文件类型
    Python中import的用法
    Python Symbols 各种符号
    python 一行写多个语句
    免费SSL证书(https网站)申请,便宜SSL https证书申请
    元宇宙游戏Axie龙头axs分析
    OLE DB provider "SQLNCLI10" for linked server "x.x.x.x" returned message "No transaction is active.".
    The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "xxx.xxx.xxx.xxx" was unable to begin a distributed transaction.
  • 原文地址:https://www.cnblogs.com/12qw/p/8645343.html
Copyright © 2011-2022 走看看