首页 > 学院 > 开发设计 > 正文

AsyncTask异步任务加载网络数据

2019-11-08 00:20:21
字体:
来源:转载
供稿:网友

异步任务加载网络数据

在Android中提供了一个异步任务的类AsyncTask,简单来说,这个类中的任务是运行在后台线程中的, 并可以将结果放到UI线程中进行处理,它定义了三种泛型,分别是Params、PRogress和Result,分别表示请求的参数、任务的进度和获得结果的数据。 1. 使用原因: * 是其中使用了线程池技术,而且其中的方法很容易实现调用 * 可以调用相关的方法,在开启子线程前和后,进行界面的更新 * 一旦任务多了,不用每次new新的线程,可以直接调用 2. 执行的顺序: onPreExecute()[执行前开启]—>doInBackground()—>onProgressUpDate()—>onPostExecute() 3. 执行过程: 当一个异步任务开启后,执行过程如下: * onPreExecute(): 这个方法是执行在主线程中的,这步操作是用于准备好任务的,作为任务加载的准备工作。建议在这个方法中做好初始化工作,弹出一个对话框。 * doInBackground(): 这个方法是执行在子线程中的,当onPreExecute()执行完后,会立即开启这个方法,在方法中可以执行耗时的操作,需要将请求参数传递进来,发给服务器,并将获取到的数据返回,数据会传给最后一步中:这些值都是将被放到主线程种,也可以不断的传给下一步的onProgressUpdate()中进行更新,可以通过不断调用publishProgress(),将数据(或进度)不断传递给onProgressUpdate()方法,进行不断更新界面 * onProgressUpdate(): 这个方法是执行在主线程中的,publishProgress()在被调用后才开启的这个方法,它在何时被开启是不确定的,执行这个方法的过程中,doInBackground()是仍在执行的,即子线程还在运行着 * onPostExecute(): 这个方法是执行在主线程中的,当后台的子线程执行完毕后才调用此方法。doInBackground()返回的结果会作为参数被传递过来,可以在这个方法中进行更新界面的操作 * execute(): 最后创建AsyncTask自定义的类,开启异步任务 4. 实现原理: 1. 线程池的创建: 在创建了AsyncTask的时候,会默认创建一个线程池ThreadPoolExecutor,并默认创建出5个线程放入到线程池中,最多可放128个线程,且这个线程池是公共的唯一一份。 2. 任务的执行: 在exexute中,会执行run方法,当执行完run方法后,会调用scheduleNext()不断的从双端队列中轮询,获取下一个任务并继续放到一个子线程中执行,知道异步任务执行完毕 3. 消息的处理: 在执行完onPreExecute()方法之后,执行了doInBackground()方法,然后就不断的发送请求获取数据,在这个AsycTask中维护了一个InternalHandler的类,这个类是继承Handler的,获取的数据是通过handler进行处理和发送的。在其handlerMessage方法中,将消息传递给onProgressUpdate()进行进度的更新,也就可以将结果发送到主线程中,进行界面的更新了 5. 需要注意的是: * 这个AsyncTask类必须由子类调用 * 虽然是放在子线程中执行的操作,但是不建议做特别耗时的操作,如果操作过于耗时,建议使用线程池TreadPoolExecutor和FutureTask

示例代码:

private class DownLoadFilesTask 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.downloadFiles(url[i]); publishProgress(int)((i/(foaltcount)*100)); if(isCancelled()) break; } return totalSize; }protected void onProgressUpdate(integer...progress){ setProgressPercent(progress[0]); }protected void onPostExecute(Long result){ showDialog("Downloaded" + result + "bytes"); }}new DownLoadFielsTask().execute(url1,url2,url3);
上一篇:瞎搞知识(view属性1)

下一篇:runtime 理解

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表