zoukankan      html  css  js  c++  java
  • Android中异步类AsyncTask的理解

    这里有两种解释的方法,各有侧重点:

    第一种解释:

    Async Task 简介:
    AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦
      AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
      Params 启动任务执行的输入参数,比如HTTP请求的URL。
      Progress 后台任务执行的百分比。
      Result 后台执行任务最终返回的结果,比如String。

         AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。
      1) 子类化Async1Task
      2) 实现AsyncTask中定义的下面一个或几个方法
         onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
        doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
        onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
        onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.

    为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
      1) Task的实例必须在UI thread中创建
      2) execute方法必须在UI thread中调用
      3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
      4) 该task只能被执行一次,否则多次调用时将会出现异常
          doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第三个为doInBackground返回和onPostExecute传入的参数。

    需要说明AsyncTask不能完全取代线程,在一些逻辑较为复杂或者需要在后台反复执行的逻辑就可能需要线程来实现了。

    第二种解释:

    AsyncTask抽象出后台线程运行的五个状态,分别是:1、准备运行,2、正在后台运行,3、进度更新,4、完成后台任务,5、取消任务,对于这五个阶段,AsyncTask提供了五个回调函数:

        1)准备运行:onPreExecute(),该回调函数在任务被执行之后立即由UI线程调用。这个步骤通常用来建立任务,在用户接口(UI)上显示进度条。

        2)正在后台运行:doInBackground(Params...),该回调函数由后台线程在onPreExecute()方法执行结束后立即调用。通常在这里执行耗时的后台计算。计算的结果必须由该函数返回,并被传递到onPostExecute()中。在该函数内也可以使用publishProgress(Progress...)来发布一个或多个进度单位(unitsof progress)。这些值将会在onProgressUpdate(Progress...)中被发布到UI线程。

        3)进度更新:onProgressUpdate(Progress...),该函数由UI线程在publishProgress(Progress...)方法调用完后被调用。一般用于动态地显示一个进度条。

        4)完成后台任务:onPostExecute(Result),当后台计算结束后调用。后台计算的结果会被作为参数传递给这一函数。

        5)取消任务:onCancelled (),在调用AsyncTask的cancel()方法时调用

    AsyncTask的构造函数有三个模板参数:

      (1)Params,传递给后台任务的参数类型。

      (2)Progress,后台计算执行过程中,进步单位(progress units)的类型。(就是后台程序已经执行了百分之几了。)

      (3)Result, 后台执行返回的结果的类型。

    AsyncTask并不总是需要使用上面的全部3种类型。标识不使用的类型很简单,只需要使用Void类型即可
     

    第三:关于AsynTask与Handler的一些区别:

    1.AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.

    使用的优点:

      a. 简单,快捷

      b. 过程可控

    使用的缺点:

       a.在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.

    2. Handler异步实现的原理和适用的优缺点

    在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)运行并生成Message-àLooper获取Message并传递给Handler、àHandler逐个获取Looper中的Message,并进行UI变更。

    使用的优点: www.2cto.com

       a.结构清晰,功能定义明确

       b.对于多个后台任务时,简单,清晰 

    使用的缺点:

      a.在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)

     作者:tianfeng701

  • 相关阅读:
    数字问题-LeetCode 462、463、473、474、475、476、477、482(二分)
    数字问题-LeetCode 452、453、454、455、456、459(KMP算法)
    Python之多进程、多线程---王要胜---2020-01-01
    生活与思考
    英文每日记录
    运维面试题五十题
    利用阿里云ECS跳板机内网穿透- ssh
    曾经的自己
    python 开发必备知识
    人生路上的思考
  • 原文地址:https://www.cnblogs.com/jyycnblogs/p/5045538.html
Copyright © 2011-2022 走看看