源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

AsyncTask官方文档教程整理

  • 时间:2022-09-29 07:20 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:AsyncTask官方文档教程整理
[b]简介[/b] Android给我们提供了一种轻量级的异步任务类AsyncTask。该类中实现异步操作,并提供接口反馈当前异步执行结果及进度,这些接口中有直接运行在主线程中的(如 onPostExecute,onPreExecute等)。 AsyncTask可以轻松正确的使用UI线程,这个类允许你在后台操作,并且不需要使用threads或者handler将结果发布到UI线程。 AsyncTask设计之初就是辅助Thread和Handler的,并且不会生成线程。AsyncTask应该被用于短时间内的操作(最多几秒钟),如果你想要长时间保持线程运行,请使用Executor或者ThreadPoolExecutor或者FutureTask。 AsyncTask在后台运行任务,在UI线程发布结果,定义三个参数,Params, Progress和Result,执行四个步骤,onPreExecute, doInBackground, onProgressUpdate和onPostExecute。 [b]使用方法[/b] AsyncTask必须被继承来使用。子类必须实现至少一个方法[code](ddoInBackground(Params…))[/code] ,还有一个最常用的方法[code](onPostExecute(Result)[/code] 。
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.downloadFile(urls[i]);
   publishProgress((int) ((i / (float) count) * 100));
   // Escape early if cancel() is called
   if (isCancelled()) break;
  }
  return totalSize;
 }
 protected void onProgressUpdate(Integer... progress) {
  setProgressPercent(progress[0]);
 }
 protected void onPostExecute(Long result) {
  showDialog("Downloaded " + result + " bytes");
 }
}
启动异步任务:
new DownloadFilesTask().execute(url1, url2, url3);
[b]AsyncTasks的范型参数[/b] 异步任务使用的参数是: [list] [*]Params, 启动任务时传入的参数[/*] [*]Progress, 在后台任务执行时发布到UI线程的进度类型[/*] [*]Result, 后台任务执行完成的结果 [/*] [/list] 这三个参数不一定非要指定,可以使用Void来传入空值。
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
[b]4个步骤[/b] [list] [*][code]onPreExecute()[/code] ,在应用程序执行前在UI线程上调用。这步通常被用来准备任务开始,例如显示一个进度条。[/*] [*][code]doInBackground(Params…)[/code] ,在[code]onPreExecute()[/code]方法被调用后立即执行此方法,用来执行长时间的任务。[/*] [*]参数会在这一步传入,最后的结果必须返回。在这步页可以使用[code]publishProgress(Progress...)[/code]来发布进度,这些值时在UI线程中发布的,在[code]onProgressUpdate(Progress...)[/code]接收。[code]onProgressUpdate(Progress…)[/code] , 在[code]publishProgress(Progress...)[/code]方法调用后在UI线程调用此方法。执行时间未定义。该方法用于在后台计算仍在执行时,用户界面中显示的进度。例如,它可以用于对进度条进行动画处理或在文本字段中显示日志。[/*] [*][code]onPostExecute(Result) [/code],在后台计算完成后在UI线程上调用。 后台计算的结果作为参数传递给该步骤。 [/*] [/list] [b]取消异步任务[/b] 任何时候都可以通过调用[code]cancel(boolean)[/code]方法来取消任务。 调用此方法将导致对[code]isCancelled()[/code]的后续调用返回true。 调用此方法后,[code]onCancelled(Object)[/code] ,而不调用[code]onPostExecute(Object)[/code] 为了尽可能快地取消任务,应该始终从[code]doInBackground(Object [])[/code]中定期检查[code]isCancelled()[/code]的返回值(如果可能的话)。 [b]线程规则[/b] [list] [*]必须在UI线程上加载AsyncTask类。[/*] [*]必须在UI线程上创建任务实例。[/*] [*]必须在UI线程上调用[code]execute(Params …)[/code][/*] [*]不要手动调用[code]onPreExecute()[/code] ,[code]onPostExecute(Result)[/code] ,[code]doInBackground(Params …)[/code] ,[code]onProgressUpdate(Progress …)[/code] 。[/*] [*]该任务只能执行一次(如果尝试第二次执行,将抛出异常)。 [/*] [/list] [b]内存监控[/b] AsyncTask保证所有回调调用都是同步的,使得以下操作在没有显式同步的情况下是安全的。 [list] [*]在构造函数或[code]onPreExecute()[/code]中设置成员字段,并在[code]doInBackground(Params …)[/code]中引用它们。[/*] [*]在[code]doInBackground(Params …)[/code]中设置成员字段,并在[code]onProgressUpdate(Progress …)[/code]和[code]onPostExecute(Result)[/code]中引用它们。 [/*] [/list] [b]执行顺序[/b] 首次引入时,AsyncTasks在单个后台线程上串行执行。 从DONUT开始,这被更改为一个允许多个任务并行操作的线程池。 从HONEYCOMB开始,任务在单个线程上执行,以避免并行执行引起的常见应用程序错误。 如果真的需要并行执行,则可以使用THREAD_POOL_EXECUTOR调用[code]executeOnExecutor(java.util.concurrent.Executor,Object [])[/code] 。 [b]总结[/b] 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程素材网的支持。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部