关闭

Android异步任务机制之AsycTask

114人阅读 评论(0) 收藏 举报

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。

本篇就说说AsyncTask的异步实现。

1、什么时候使用 AsnyncTask

  主线程主要负责控制UI页面的显示、更新、交互等。 为了有更好的用户体验,UI线程中的操作要求越短越好。

  我们把耗时的操作(例如网络请求、数据库操作、复杂计算)放到单独的子线程中操作,以避免主线程的阻塞。但是在子线程中不能更新UI界面,这时候需要使用handler。

  但如果耗时的操作太多,那么我们需要开启太多的子线程,这就会给系统带来巨大的负担,随之也会带来性能方面的问题。在这种情况下我们就可以考虑使用类AsyncTask来异步执行任务,不需要子线程和handler,就可以完成异步操作和刷新UI。

  不要随意使用AsyncTask,除非你必须要与UI线程交互.默认情况下使用Thread即可,要注意需要将线程优先级调低.AsyncTask适合处理短时间的操作,长时间的操作,比如下载一个很大的视频,这就需要你使用自己的线程来下载,不管是断点下载还是其它的.

2、AsnyncTask原理

  AsyncTask主要有二个部分:一个是与主线程的交互,另一个就是线程的管理调度。虽然可能多个AsyncTask的子类的实例,但是AsyncTask的内部Handler和ThreadPoolExecutor都是进程范围内共享的,其都是static的,也即属于类的,类的属性的作用范围是CLASSPATH,因为一个进程一个VM,所以是AsyncTask控制着进程范围内所有的子类实例。 

  AsyncTask内部会创建一个进程作用域的线程池来管理要运行的任务,也就就是说当你调用了AsyncTask的execute()方法后,AsyncTask会把任务交给线程池,由线程池来管理创建Thread和运行Therad。

3、AsyncTask介绍

  Android的AsyncTask比Handler更轻量级一些(只是代码上轻量一些,而实际上要比handler更耗资源),适用于简单的异步处理。 
   
  Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),因为UI的更新只能在主线程中完成,因此异步处理是不可避免的。

  AsyncTask:对线程间的通讯做了包装,是后台线程和UI线程可以简易通讯:后台线程执行异步任务,将result告知UI线程。

使用AsyncTask分为两步: 

① 继承AsyncTask类实现自己的类

public abstract class AsyncTask<Params, Progress, Result> {

Params: 输入参数,对应excute()方法中传递的参数。如果不需要传递参数,则直接设为void即可。

Progress:后台任务执行的百分比

Result:返回值类型,和doInBackground()方法的返回值类型保持一致。

②复写方法

最少要重写以下这两个方法:

4、AsyncTask示例

按照上面的步骤定义自己的异步类:

public class MyTask extends AsyncTask<String, Integer, String> {  
    //执行的第一个方法用于在执行后台任务前做一些UI操作  
    @Override  
    protected void onPreExecute() {  

    }  

    //第二个执行方法,在onPreExecute()后执行,用于后台任务,不可在此方法内修改UI
    @Override  
    protected String doInBackground(String... params) {  
         //处理耗时操作
        return "后台任务执行完毕";  
    }  

   /*这个函数在doInBackground调用publishProgress(int i)时触发,虽然调用时只有一个参数  
    但是这里取到的是一个数组,所以要用progesss[0]来取值  
    第n个参数就用progress[n]来取值   */
    @Override  
    protected void onProgressUpdate(Integer... progresses) {  
        //"loading..." + progresses[0] + "%"
        super.onProgressUpdate(progress);  
    }  

    /*doInBackground返回时触发,换句话说,就是doInBackground执行完后触发  
    这里的result就是上面doInBackground执行后的返回值,所以这里是"后台任务执行完毕"  */
    @Override  
    protected void onPostExecute(String result) { 

    }  

    //onCancelled方法用于在取消执行中的任务时更改UI  
    @Override  
    protected void onCancelled() {  

    }  
}

在主线程申明该类的对象,调用对象的execute()函数开始执行。

MyTask t= new MyTask();
t.execute();//这里没有参数
5、使用AsyncTask需要注意的地方

0
0
查看评论

Android异步任务机制之AsycTask

什么时候使用AsnyncTask、AsnyncTask原理、AsyncTask介绍、AsyncTask示例、使用AsyncTask需要注意的地方
  • Amazing7
  • Amazing7
  • 2016-05-16 17:37
  • 10084

事件处理机制之AnsyncTask异步任务

(一)概述 本节给大家带来的是Android给我们提供的一个轻量级的用于处理异步任务的类:AsyncTask,我们一般是 继承AsyncTask,然后在类中实现异步操作,然后将异步执行的进度,反馈给UI主线程~ 好吧,可能有些概念大家不懂,觉得还是有必要讲解下多线程的概念,那就先解释下一些概念性的...
  • MakeYourChance
  • MakeYourChance
  • 2016-07-03 11:48
  • 3746

android中异步任务AsyncTask的应用和工作原理

android4.0之后,android不允许在UI线程(主线程)中运行其他耗时线程,如网络请求的线程,否则就会崩溃抛出NetWorkOnMainThreadException 而且将耗时线程放入主线程中执行,会大大影响客户体验,所以android为我们提供了其他的处理方法,其中一种常用的就是,异步...
  • yxb_yingu
  • yxb_yingu
  • 2016-05-31 18:55
  • 1206

Android异步任务机制之Handler

Android系统中实现了消息循环机制。Android通过Looper、Handler来实现消息循环机制。Android的消息循环是针对线程的,每个线程都可以有自己的消息队列MessageQueue和消息循环Looper。 一个Thead中可以建立多个Hander,通过msg.target保证Me...
  • qq_28758749
  • qq_28758749
  • 2016-05-13 23:45
  • 141

Android异步任务机制之 AsyncTask

转自: http://blog.csdn.net/liuhe688/article/details/6532519 在Android中实现异步任务机制有两种方式,Handler和AsyncTask。 Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Hand...
  • sinat_31500569
  • sinat_31500569
  • 2017-04-12 21:03
  • 136

Android异步任务机制之AsyncTask

Handler 的缺点:例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。 1. public a...
  • qq_28758749
  • qq_28758749
  • 2016-05-13 23:48
  • 120

Android中AsyncTask(异步任务)详解

1、   Android中的单线程模型 当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做U...
  • u012468376
  • u012468376
  • 2016-02-21 15:40
  • 5808

Android多线程及异步任务消息处理机制(一)--Handler的使用

转载请注明出处: 前言         我们知道,不管在任何的语言或操作系统平台(Android系统也不例外),多线程、多进程和异步任务的相关技术地讨论都是永恒的话题,很多的开发需求都需要使用多线程及异步任务以便实现多任务的同时执行和灵活的...
  • yegongheng
  • yegongheng
  • 2014-08-26 12:39
  • 3170

Android异步任务机制—AsyncTask

AsyncTask实现的原理,和适用的优缺点AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.Handler模式需要为每一个任务创建一个新的线...
  • qq_37293612
  • qq_37293612
  • 2017-01-14 17:16
  • 132

Android异步任务机制—Handler

介绍熟悉Windows编程的朋友知道Windows程序是消息驱动的,并且有全局的消息循环系统。Google参考了Windows的消息循环机制,也在Android系统中实现了消息循环机制。 Android的消息循环是针对线程的,每个线程都可以有自己的消息队列和消息循环。Handler机制主要角色Me...
  • qq_37293612
  • qq_37293612
  • 2017-01-14 17:50
  • 119
    最新评论