Android之异步调用

  • 概述
    AsyncTask可以很好的,准确的使用UI线程,他可以将一个比较耗时(几秒钟)的动作运行在后台,并且能将结果返回至UI线程中,不需要通过(Thread操作和Handler操作)。
    使用时必须通过创建一个AsyncTask的子类,至少重写其doInBackground(顾名思义,你想在后台执行怎样的一个操作)方法,大多数也会重写onPostExcute(后台执行完之后你想将一个结果返回在UI线程的哪里)方法。
  • AsyncTask的三种泛型定义和四个步骤
    首先了解AsyncTask的三种泛型定义,如图:

    Params:执行后台操作时发给任务的参数类型,即doInBackground方法的参数,例:如果执行后台下载图片的文件,此处可为String 类型的imagePath。
    Progress:后台操作执行过程中进度的类型。
    Result:返回给UI线程的数据类型。即onPostExcute方法的参数,例:如果后台执行的是一个图片下载任务,此处肯定将返回一个Bitmap类型给UI线程。
    当然并不是所有的类型都会使用到,例如Progress,如果不需要显示进度条,将无需设计这个类型,直接用Void类型。
    其次了解其四个步骤:
    onPreExcute:执行后台任务之前做的操作,例如可以是弹出一个Dialog提示用户正在下载中。同时需要在onPostExcute方法中将该Dialog dismiss。
    onInBackground:略。前面已讲述。补充:此方法中可以使用publishProgress发布进度单元,且进度单元会发布在onProgressUpdate步骤中。
    onProgressUpdate:顾名思义就是进行进度条的更新操作。将进度单元显示在UI线程中。
    onPostExcute:略。补充:此方法的参数是doInBackground方法返回的结果。
  • AsyncTask正常运行的条件:
    ①必须在UI线程中加载AsyncTask类。
    ②必须在UI线程中创建任务实例。
    前面两点总结起来就是要在UI线程中创建AsyncTask的子类,并且必须在UI线程中实例化。
    ③在UI线程中调用excute()来执行任务。不要手动调用AsyncTask的四个步骤函数。
  • 为啥doInBackground方法中调用publishProgress,在onProgressUpdate可以实时更新进度条。
    因为在调用publishProgress之前,doInBackground的任何记忆效应对onProgressUpdate来说是可见的,而且后续的publishProgress不会影响onProgressUpdate正在进行的操作。

  • 下面展示一个异步加载图片的操作
    ①准备工作
    》访问网络图片,首先需要授予权限。Manifest.xml中 节点之前添加如下语句开启APP访问网络的权限

    》请求下载网络图片需要到HttpClient这个类,但是在Android 6.0之后不再支持HttpClient,但是还是可以用,需要在APP的build.gradle中添加如下代码:

猜你喜欢

转载自www.cnblogs.com/21-T/p/10940179.html