热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

详解Android中AsyncTask的使用

这篇文章主要介绍了详解Android中AsyncTask的使用的相关资料,这里提供实例帮助大家学习理解这部分内容,需要的朋友可以参考下

详解Android 中AsyncTask 的使用

1、首先我们来看看AsyncTask 的介绍:  

   Handler 和 AsyncTask 都是android 中用来实现异步任务处理的方式;其中:

    Handler 实例向 UI 线程发送消息,完成界面更新, 

        优点:对整个过程控制的比较精细;
        缺点:代码相对臃肿,多个任务同时执行时,不易对线程进行精确的控制;

    AsyncTask :比Handler 更轻量级一些,适用于简单的异步处理; 

        优点:简单 | 快捷 | 过程可控;
        缺点:使用多个异步操作时就变得复杂起来;

2、AsyncTask 的定义:(AsyncTask 定义了三种泛型类型) 

  public abstract class AsyncTask{...} 

    说明: 

        Params :启动任务执行的输入参数,例如:HTTP 请求的URL;
        Progress: 后台任务执行的百分比;
        Result:后台执行任务最终返回的结果,比如String;

3、AsyncTask 异步任务的执行步骤:(以下方法除execute(Params... params),在AsyncTask中重写),下列是相关方法的介绍:

    A、execute(Params... params) : 

        执行一个异步任务,需要我们在UI线程中调用,触发任务

    B、OnPreExecute(): 

        execute(Params... params)调用后立即执行,一般用于在执行后台任务前对UI做一些标记; 例如,可以在此处显示进度对话框;

    C、doInBackground(Params.. params): 

        onPreExecute() 完成后执行,后台执行,处理比较耗时的操作;此处不能操作UI,执行的过程中调用publishProgress(Progress... values)来更新进度信息;

    D、onProgressUpdate(Progress... values): 

        在调用publicshProgress(Progress... values)方法执行,直接将进度信息更新到UI组建上;此方法在主线程上执行,用于显示任务执行的进度;

    E、onPostExecute(Result result): 

        此方法在主线程中执行,当后台的操作结束时,此方法会被调用,计算结果作为参数传递到此方法中,直接将结果显示到UI组建上。

    F、cancel(); : 

        取消一个正在执行的任务,在UI线程中完成,用AsyncTask的对象进行调用,参数为true/false;

4、使用AsyncTask 时注意事项: 

    A、异步任务实例必须在UI线程中创建;
    B、execute(Params... params) 方法必须在UI线程中调用;
    C、不要手动的调onPreExecute().doInBackground().onProgressUpdate().onPostExecute()这几个方法;
    D、不能在doInBackground(Params... params) 中更改组件信息;
    E、一个任务实例只能执行一次,如果执行第二次会抛出异常;

5、案例:使用AsyncTask 实现图片的下载:

    Activity类,主程序的入口:

  public class MainActivity extends Activity { 
 
  // 程序入口 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    MyAsyncTask my = new MyAsyncTask(); 
    my.execute("http://photocdn.sohu.com/20110927/Img320705637.jpg"); 
  } 
 
} 

   AsyncTask 派生类,实现异步任务:

  package com.sun.asynctask; 
 
import java.io.ByteArrayOutputStream; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
 
import org.apache.http.HttpConnection; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.HttpStatus; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.util.Log; 
 
/** 
 * 异步任务,实现网页内容的获取 
 * 
 * 
 * 生成该类的对象,并调用execute方法之后 
 * 
 * 首先执行的是onProExecute() 方法, 
 * 
 * 其次执行的doInBackground()方法 
 */ 
public class MyAsyncTask extends AsyncTask { 
 
  /** 
   * 在execute() 方法执行后立即执行,运行在UI线程中, 
   * 在后台任务开始前执行,用于标识UI界面 
   */ 
  protected void onPreExecute() { 
    super.onPreExecute(); 
    Log.i("msg","onPreExecute()..."); 
  } 
 
  /** 
   * 后台执行耗时的任务; 
   * 
   * 方法中的 String 参数对应 AsyncTask的第一个参数; 
   * 返回的 Bitmap 对应的是AsyncTask 的第三个参数; 
   * 
   * 该方法并不运行在UI线程中,主要用于异步操作,可以调用publishProgress()方法触发 
   * onProgressUpdate对UI进行操作; 
   * 
   */ 
  protected Bitmap doInBackground(String... params) { 
    Log.i("msg","doInBackground(String... params)..."); 
 
    try { 
 
      /* 网络访问方式 二 */ 
      /* 
      URL url = new URL(params[0]); 
      HttpsURLConnection cOnnection= (HttpsURLConnection) url.openConnection(); 
      connection.connect(); // 开始连接 
      int zOng= connection.getContentLength(); 
      InputStream is2 = connection.getInputStream(); 
      */ 
 
      /* 开始网络访问数据 */ 
      HttpGet hg = new HttpGet(params[0]); // 此处注意参数的用法 
      HttpClient hc = new DefaultHttpClient(); 
      HttpResponse hr = hc.execute(hg); // 发送请求,得到响应 
 
      // 判断请求是否成功 
      if(hr.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ 
        Log.i("msg", "access success..."); 
        HttpEntity he = hr.getEntity(); 
        InputStream is = he.getContent(); // 获取输入流对象,好比搭桥 
        long total = he.getContentLength(); // 文件的总字节数 
 
        ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 输出流,临时容器,用于装从is中流出的数据 
 
        byte[] buffer = new byte[1024]; // 缓存容器,每次装载1024 个字节数据 
        int len = 0; // 每次读的字节数 
        int curLen = 0 ; // 已读多少数据 
 
        while((len=is.read(buffer))!=-1){ // 当len !=-1 时,也就是还有数据可读 
          Log.i("msg","begin read data..."+len+",total:"+total); 
          baos.write(buffer, 0, len); // 向临时容器中装数据 
          curLen=curLen+len; // 更新已读的数据 
 
          /* 在UI显示当前读取的进度 , 调用次方法触发onProgressUpdate() 方法执行 */ 
          publishProgress((int)(((float)curLen/total)*100)); 
        } 
 
        Bitmap bitmap = BitmapFactory.decodeByteArray(baos.toByteArray(), 0, (int)total); 
        is.close(); 
        return bitmap; 
      } 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
 
    return null; 
  } 
 
  /** 
   * 括号中的参数:String 对应的是AsyncTask 的第三个参数,也就是 
   * 接收了 从doInBackground() 返回的结果; 
   * 此方法在 doInBackground() 方法执行结束后执行,运行在UI线程中, 
   * 可以对UI进行更新 
   */ 
  protected void onPostExecute(Bitmap result) { 
    super.onPostExecute(result); 
    Log.i("msg","onPostExecute(String result)..."+result.getHeight()); 
  } 
 
 
  /** 
   * 方法括号中的Integer 对应AsyncTask 中的第二个参数; 
   * 在doInBackground() 中每次调用publishProgress() 时被执行; 
   * 该方法是在UI线程中的,所以可以用于对UI进行更新 
   */ 
  protected void onProgressUpdate(Integer... values) { 
    super.onProgressUpdate(values); 
 
    Log.i("msg","onProgressUpdate(Integer... values)..."+values[0]); 
  } 
 
 
  /** 
   * 图片的下载 
   */ 
  public HttpURLConnection downPic(String urltemp){ 
 
    try { 
      URL url = new URL(urltemp); // 确定连接地址 
      // 打开一个连接 
      HttpURLConnection cOnnection= (HttpURLConnection) url.openConnection(); 
      connection.connect(); // 开始连接 
      return connection; 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
    return null; 
  } 
 
 
 
} 


以上就是Android AsyncTask的应用实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


推荐阅读
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • 深入解析Hadoop的核心组件与工作原理
    本文详细介绍了Hadoop的三大核心组件:分布式文件系统HDFS、资源管理器YARN和分布式计算框架MapReduce。通过分析这些组件的工作机制,帮助读者更好地理解Hadoop的架构及其在大数据处理中的应用。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 本文探讨了如何在Hive(基于Hadoop)环境中编写类似SQL的语句,以去除字段中的空格。特别是在处理邮政编码等数据时,去除特定位置的空格是常见的需求。 ... [详细]
  • 本文详细介绍了如何在 Android 中使用值动画(ValueAnimator)来动态调整 ImageView 的高度,并探讨了相关的关键属性和方法,包括图片填充后的高度、原始图片高度、动画变化因子以及布局重置等。 ... [详细]
  • 近期我们开发了一款包含天气预报功能的万年历应用,为了满足这一需求,团队花费数日时间精心打造并测试了一个稳定可靠的天气API接口,现正式对外开放。 ... [详细]
author-avatar
show窝_515
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有