AsyncTask与IntentService

Android主线程,也就是UI线程,其最大用途在于运行四大组件以及处理他们和用户的交互。其他耗时操作交给子线程,如网络请求、I/O操作,从Android3.0开始,网络访问必须在子线程中进行,否则将会失败并抛弃异常,避免ANR现象。

Thread、AsyncTask、HandlerThread、IntentService都是线程。AsyncTask是轻量级异步任务类,封装了Thread和Handler。

AsyncTask

onPreExecute(),异步执行之前,此方法被调用做一些准备工作。doInBackground()在线程池中执行,此方法用于执行异步任务。doInBackground()在线程池中执行,此方法用于执行异步任务,执行过程中可以调用publishProgress()方法更新任务执行进度。onProgressUpdate()方法在主线程中执行,每次任务进度更新时被调用。onPostExecute()在任务执行完成时被调用,其参数为doInBackground()的返回参数。

执行顺序与联系如下图

代码Demo:


public class DownloadFileAsyncTackDemo extends AsyncTask<URL, Integer, Long> {

    protected  Long doInBackground(URL... urls){
        int count = urls.length;
        long totalSize = 0;
        for(int i = 0; i < count; i++){
            totalSize += Downloader.downloadFile(urls[i]);
            publishProgress((int) (i / (float) count) * 100 );
            if(isCancelled()){
                break;
            }
        }
        return totalSize;
    }

    protected void onProgressUpdate(Integer... progress){
        setProgressPercent(progress[0]);
    }

    protected void onPostExecute(Long result){
        Log.d("",String.valueOf(result));
    }

}

AsyncTask注意事项:

  1. 必须在主线程中加载,意味着第一次访问AsyncTask必须发生在主线程。
  2. Execute方法必须在UI线程调用。不能直接调用onPreExecute()、doInBackground()、publishProgress()、onPostExecute()、onProgressUpdate()方法。
  3. 一个AsyncTask对象只能被执行一次,既只调用一次。
  4. AsyncTask在4.1.1上是串行的,在2.3.3上是并行的。在3.0版本后可使用executeOnExecutor()方法启动以实现并行。

IntentService:

         IntentService是一种特殊的Service继承自Service,任务执行后会自动停止。因为其是Service,因此优先级会比单纯的线程高。且不容易被系统杀死。第一次启动调用onCreate,每次启动调用一次onStartCommand,在onStartCommd处理每个后台任务的Intent。

OnHandleIntent():抽象类,每次都需要实现。是处理任务的地方

每执行一个后台任务,必须启动一次Intentservice。当有多个后台任务,按照外界发起的顺序执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值