AsyncTask简单学习

本文介绍了Android中AsyncTask的基本使用方法及内部原理。通过示例代码展示了如何执行后台任务,并解释了onPreExecute、doInBackground等关键方法的作用。同时,还提到了AsyncTask的参数类型和注意事项。

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

简单使用

直接使用匿名内部类即可:

new AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... params) {
        //这里做网络操作或者耗时操作即可
        return null;
    }
    @Override
    protected void onPostExecute(Void aVoid) {
        //这里处理网络操作结果,或者更新ui
    }
}.execute();

如果你仅仅要会用,以上便已足够用在很多情况了!
下面我们来详细了解下这个东东。

详细解释

new AsyncTask<Params, Progress, Result>{
        protected void onPreExecute(){}

        protected Result doInBackground(Params... params){}

        protected void onProgressUpdate(Progress... values){}

        protected void onPostExecute(Result  result){}

        protected void onCancelled() {}

}.execute(); 

方法解释:

  • onPreExecute(): 首先执行,与主线程在同一线程,可以先对ui进行一些预处理,该方法可以不实现
  • doInBackground() : 将在onPreExecute 方法执行后马上执行,后台任务执行的线程,不与主线程在同一线程内,该方法必须实现
  • onProgressUpdate():可以进行进度条的更新,或者更新ui也可以,此方法和主线程在同一线程内,在doInBackground方法中调用publishProgress(progress)方法即会执行该方法,方便在任务执行过程中了解任务的进度,同时在界面上显示任务的进度情况,该方法不一定需要实现
  • onPostExecute(): 任务执行完成后执行,处理doInBackground返回的结果,和主线程在同一线程内。该方法不一定需要实现。
  • onCancelled() : 在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用,该方法不一定需要实现。(该方法不一定能成功)

参数解释:

AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params : 启动任务执行的输入参数,比如HTTP请求的URL。 可以在.execute()方法中传入参数。
Progress : 任务执行过程中可用来传递消息的参数,方便了解任务的执行情况。例如可以用来更新进度条之类的。
Result : 后台执行任务最终返回的结果,比如String。

注意事项:

1、 AsyncTask 的最大上限数量

在Android 3.0之前,在AsyncTask中对线程池总大小有限制,同一时刻能够运行的线程数做了规定,代码如下所示:

private static final int CORE_POOL_SIZE = 5;  
private static final int MAXIMUM_POOL_SIZE = 128;  
private static final int KEEP_ALIVE = 10;  
……  
private static final ThreadPoolExecutor sExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE, 
MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory); 

可以看到,这里规定同一时刻能够运行的线程数为5个,线程池总大小为128。也就是说当我们启动了10个任务时,只有5个任务能够立刻执行,另外的5个任务则需要等待,当有一个任务执行完毕后,第6个任务才会启动,以此类推。而线程池中最大能存放的线程数是128个,当我们尝试去添加第129个任务时,程序就会崩溃。当然在3.0之后有了很大改变,我们下篇源码解析再说;

2、 .execute(Params… params);
方法可以有带参数的方法,以该方法执行,则doInBackground接收的参数即是该参数
以上方法中的参数都是数组,比如doInBackground(Params...  params)方法中,取得参数一般是用params[0]取得传入的参数,params[n]即取得第n个参数
3、 为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI 线程中创建
2) execute方法必须在UI 线程中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。
4) 该task只能被执行一次,否则多次调用时将会出现异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值