• 异步任务(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 只能被执行一次,多次调用将会引发异常。  

  • 相关阅读:
    nginx能访问html静态文件但无法访问php文件
    LeetCode "498. Diagonal Traverse"
    LeetCode "Teemo Attacking"
    LeetCode "501. Find Mode in Binary Search Tree"
    LeetCode "483. Smallest Good Base" !!
    LeetCode "467. Unique Substrings in Wraparound String" !!
    LeetCode "437. Path Sum III"
    LeetCode "454. 4Sum II"
    LeetCode "445. Add Two Numbers II"
    LeetCode "486. Predict the Winner" !!
  • 原文地址:https://www.cnblogs.com/haoxiaozhang/p/5254037.html
Copyright © 2020-2023  润新知