zoukankan      html  css  js  c++  java
  • Android 开发(六)AsyncTask

    1:AsyncTask是多线程吗?
    答:是。
    2:AsyncTask与Handler相比,谁更轻量级?
    答:通过看源码,发现AsyncTask实际上就是一个线程池,而网上的说法是AsyncTask比handler要轻量级,显然上不准确的,只能这样 说,AsyncTask在代码上比handler要轻量级别,而实际上要比handler更耗资源,因为AsyncTask底层是一个线程池!而 Handler仅仅就是发送了一个消息队列,连线程都没有开。
          但是,如果异步任务的数据特别庞大,AsyncTask这种线程池结构的优势就体现出来了。

    AsyncTask 的优势体现在:
    •线程的开销较大,如果每个任务都要创建一个线程,那么应用程 序的效率要低很多;
    •线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负。
    •另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿。

    AsyncTask定义了三种泛型类型 Params,Progress和Result。
        •Params 启动任务执行的输入参数,比如HTTP请求的URL。
        •Progress 后台任务执行的百分比。
        •Result 后台执行任务最终返回的结果,比如String。

           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只能被执行一次,否则多次调用时将会出现异常

  • 相关阅读:
    关于xml的使用。
    Input标签文件上传,使用详解
    webpack 集成 Typescript && Less
    ionic3 多级联动城市选择插件 ion-multi-picker
    ionic2(3) 密码键盘组件 ionic2-pincode-input 使用
    ionic3 图片(轮播)预览 ionic-gallary-modal组件使用方法
    ios打包,通过Xcode生成ipa文件
    php常见的验证方法
    php 时间转化为刚刚、几秒前、几分前、几天前等等,友好时间提示
    ionic node-sass安装或编译失败:MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”
  • 原文地址:https://www.cnblogs.com/xingfuzzhd/p/2650511.html
Copyright © 2011-2022 走看看