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

  • 相关阅读:
    POJ 3693 Maximum repetition substring (寻找重复次数最多的连续子串)
    URAL-1297 Palindrome (最长回文子串)
    SPOJ
    POJ Musical Theme (求最长不重叠子串)
    Leangoo看板Jenkins配置指南
    Leangoo(领歌)企业版发布,助力企业规模化敏捷
    推荐Scum敏捷开发的几款工具
    如何使用Leangoo进行简单的BUG管理
    轻量级的项目管理工具-Leangoo
    Leangoo敏捷项目协作工具到底好在哪里?
  • 原文地址:https://www.cnblogs.com/xingfuzzhd/p/2650511.html
Copyright © 2011-2022 走看看