当前位置: 移动技术网 > IT编程>移动开发>Android > 详解Android 中AsyncTask 的使用

详解Android 中AsyncTask 的使用

2019年07月24日  | 移动技术网IT编程  | 我要评论

格尔木市邮编,李开复学习网,金山词霸豆豆

详解android 中asynctask 的使用

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

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

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

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

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

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

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

  public abstract class asynctask<params,progress,result>{...} 

    说明: 

        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<string, integer, bitmap> { 
 
  /** 
   * 在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的应用实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网