Android Asynctask

本文详细介绍了AsyncTask类的使用方法及注意事项,包括如何继承AsyncTask类并实现doInBackground方法,以及如何利用onPreExecute、onProgressUpdate和onPostExecute等方法进行UI更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

Asynctask , 可以开启一个多线程执行任务,并且多线程的数据传递也是这个类自己完成。Asynctask 相比 thread 和handler 更加轻量级一点。

使用

首先继承Asynctask<Params,Progress,Result> 类 ,并必须实现doInBackground(..)方法


范型参数说明:

Params:后台任务的输入参数,比如http请求的目标url

Progress:后台任务执行的进度

Result:后台任务返回的结果,比如Api调用返回的json数据


方法:

onPreExecute(), UI线程调用,在后台任务执行前调用,可以做一些准备工作,可以不实现。

doInBackground(Params…),后台线程执行,耗时的任务写在这里,必须实现。在这个方法里可以调用publishProgress方法来更新后台任务的实时进度。

onProgressUpdate(Progress…),UI线程执行,在publishProgress方法被调用后,UI线程调用它来显示任务的进度,如在进度条上显示,或textView上显示百分比。

onPostExecute(Result),UI线程调用,doInBackground()执行完成后被调用,可以返回后台任务执行的结果。

onCancelled(),UI线程主动调用,有两个,有参数,无参数,来取消后台任务的执行,如activity被销毁,但是后台任务还没完成,就需要在activity的onDestory()方法中调用Asynctask实例的onCancelled()方法。


注意事项
  1. 主动调用asynctask的cancel方法,他会执行完doInBackground方法,然后执行onCancelled方法,不执行onPostExecute方法了。(除非在doInBackground方法中“定期检查”isCancelled()是否为true ,若为true 直接返回也行。)

  2. asynctask一个实例只能execute一次。

  3. 源码中有参数的onCancelled直接调了无参数的那个函数。

protected void onCancelled(Result result) {
        onCancelled();
    } 

比较service,Thread,IntentService,AsyncTask

   ServiceThreadIntentServiceAsyncTask
什么时候去用?没有界面的任务,但是不能太长。对于长时间的任务,在服务中使用多线程-通常是长时间的任务。

-并行的任务使用多线程(传统机制)
-长任务没有经常和主线程进行交互

-如果必须交互,可以使用主线程handle或者broadcast intents

-当需要回调时候(intent启动任务)
-长任务需要和主线程交互

-并行任务使用多实例或执行器
触发,启动使用方法onStartService()方法:Thread start()intent调用方法execute()
触发的线程任何线程任何线程主线程主线程
运行的线程主线程它自己的线程单独的工作线程工作线程,但是
局限/缺点可能阻塞主线程-手动线程控制

-代码可能很难去阅读
-不能并行执行任务

-多个意图会在同一个工作线程排队
-一个实例只能被执行一次(因此不能在一个循环中执行)

-必须在主线程中创建和执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值