zoukankan      html  css  js  c++  java
  • 异步任务(AsyncTask)

      Android的UI线程主要负责处理用户的按键事件、用户触屏事件及屏幕绘图事件等,因此开发者的其他操作不应该、也不能阻塞UI线程,否则UI界面将会变得停止响应——用户感觉非常糟糕。(总之,开发者需要牢记:不要再UI线程中执行一些耗时的操作)。

      为了避免UI线程失去响应的问题,Android建议将耗时操作放在新线程中完成,但新线程也可能需要动态更新UI组件:比如需要从网上获取一个网页,然后再TextView中将其源代码显示出来,此时就应该将连接网络、获取网络数据的操作放在新线程中完成。问题是:获取网络数据之后,新线程不允许直接更新UI组件。

      为了解决新线程不能更新UI组件的问题,Android提供了如下几种解决方案:

      1、使用Handler实现线程之间的通信.

      2、Activity.runOnUiThread(Runnable).

      3、View.post(Runnable).

      4、View.postDelayed(Runnable,long).

      后面三种方式可能导致编程略显烦琐,而异步任务(AsyncTask)则可进一步简化这种操作。

          AsyncTask<>是一个抽象类,通常用于被继承,继承 AsyncTask 时需要指定如下三个泛型参数。

      相对来说 AsyncTask 更轻量一些,适用于简单的异步处理,不需要借助线程和Handler即可实现。

      AsyncTask<Params,Progress,Result>是抽象类,它定义了如下三种泛型类型。

        1、Params:启动任务执行的输入参数的类型

        2、Progress:后台任务完成的进度值的类型

        3、Result:后台执行任务完成后返回结果的类型。

      使用AsyncTask只要如下三步即可。

        1、创建 AsyncTask 的子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,可将它指定为Void

        2、根据需要,实现 AsyncTask 的如下方法:

          2.1、doInBackground(Params...):重写该方法就是后台线程将要完成的任务。该方法可以调用publishProgress(Progress..values)方法更新任务的执行进度。

          2.2、onProgressUpdate(Progress...values):在doInBackground()方法中调用publishProgress()方法更新任务的执行进度后,将会触发该方法。

          2.3、onPreExecute():该方法将在执行后台耗时操作前被调用。通常该方法用于完成一些初始化的准备工作,比如在界面上显示进度条等。

          2.4、onPostExecute(Result result):当doInBackground()完成后,系统会自动调用onPostExecute()方法,并将doInBackground()方法的返回值传给该方法.

        3、调用 AsyncTask 子类的实例 execute(Params ... params)开始执行耗时任务。

      使用AsyncTask 是必须遵守如下规则

        1、必须在UI线程中创建 AsyncTask 的实例

        2、必须在UI线程中调用 AsyncTask 的execute()方法

        3、AsyncTask 的 onPreExecute()、onPostExecute(Result  result)、doInBackground(Params... params),onProgressUpdate(Progress...values)方法,不应该由程序员代码调用,而是由Android系统负责调用。

        4、每个 AsyncTask 只能被执行一次,多次调用将会引发异常。  

  • 相关阅读:
    网络虚拟化中的 offload 技术:LSO/LRO、GSO/GRO、TSO/UFO、RSS、VXLAN
    pve5下的iptables案例分析-无法访问input相关端口
    linux mail相关-涉及windows下nslookup使用
    qemu的vnc选项-参考至qemu wiki
    windows任务管理器-线程优先级
    在proxmox中模拟树莓派
    unzip命令的使用
    fdisk分区遇到的问题-涉及lv逻辑卷扩容
    fail2ban(1)
    Different Integers 牛客网暑期ACM多校训练营(第一场) J 离线+线状数组或者主席树
  • 原文地址:https://www.cnblogs.com/haoxiaozhang/p/5254037.html
Copyright © 2011-2022 走看看