线程---AsyncTask

转载 2013年12月04日 15:13:08

Android开发AsyncTask异步处理任务


  在开发Android应用时必须遵守单线程模型的原则:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则:

  1.不要阻塞UI线程 
  2.确保只在UI线程中访问Android UI工具包

  当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。

  比如说从网上获取一个网页,在一个TextView中将其源代码显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得页面源码后,是不能直接在网络操作线程中调TextView.setText()的因为其他线程中是不能直接访问主UI线程成员。

  Android提供了几种在其他线程中访问UI线程的方法。

  java代码:
  Activity.runOnUiThread( Runnable )
  View.post( Runnable )
  View.postDelayed( Runnable, long )

  Hanlder 
  这些类或方法同样会使你的代码很复杂很难理解。然而当你需要实现一些很复杂的操作并需要频繁地更新UI时这会变得更糟糕。

  为了解决这个问题,Android 1.5提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。不需要借助线程和Handler即可实现。

  AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。 
  Params 启动任务执行的输入参数,比如HTTP请求的URL。 
  Progress 后台任务执行的百分比。 
  Result 后台执行任务最终返回的结果,比如String。

  AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。

  1) 子类化AsyncTask 
  2) 实现AsyncTask中定义的下面一个或几个方法

  onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。

  doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。

  onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。

  onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread。

  为了正确的使用AsyncTask类,以下是几条必须遵守的准则:

  1) Task的实例必须在UI thread中创建 
  2) execute方法必须在UI thread中调用 
  3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法 
  4) 该task只能被执行一次,否则多次调用时将会出现异常

AsyncTask 坑(一) 哪些线程可以调用AsyncTask

看到很多文章说,只有主线程(UI线程)可以创建AsyncTask。个人觉得这个说法不对。从AsyncTask的角度讲,任何线程都可以创建并且使用AsyncTask。之所以会有主线程才能创建AsyncT...
  • zj510
  • zj510
  • 2016年05月24日 20:40
  • 1839

为什么 AsyncTask 实例必须在UI线程里创建?

从AsyncTask源码的角度,代领读者一步步的分析执行过程,详细的分析了,为什么AsyncTask实例的创建和execute方法的调用需要在UI线程中进行? 进而更好的使用AsyncTask,轻量级...
  • myhc2014
  • myhc2014
  • 2015年09月28日 20:40
  • 595

Android中的线程池和AsyncTask异步任务(一)

前言:线程池和AsyncTask是我们在多线程并发中经常会使用到的,那么到底它们是怎样工作的呢?又有什么区别呢?该如何选择呢?下面让我们一起来探讨。不恰当的地方还请指教!注:原创,转载请注明出处。一、...
  • sinat_34596644
  • sinat_34596644
  • 2016年04月10日 13:13
  • 1104

解决AsyncTask的线程池限制问题

这是一篇我个人在EOE发的帖子《解决AsyncTask的线程池限制问题》,由于eoe的blog系统实在是无言以对,我就把eoe上面的帖子以及blog是都转到csdn上来,原帖地址:http://www...
  • lsmfeixiang
  • lsmfeixiang
  • 2014年12月28日 13:05
  • 1342

Android AsyncTask两种线程池分析和总结

该文章转载自:http://bbs.51cto.com/thread-1114378-1.html (一)    前言 在android AsyncTask里面有两种线程池供我们调用 1.    TH...
  • wdong_love_cl
  • wdong_love_cl
  • 2016年06月01日 16:55
  • 4169

android多线程-AsyncTask之工作原理深入解析(上)

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52462830 出自【zejian的博客】 关联文章: And...
  • javazejian
  • javazejian
  • 2016年09月07日 22:47
  • 4075

AsyncTask优缺点(两种线程池)

AsyncTask两种线程池  http://bbs.51cto.com/thread-1114378-1.html (API 3.0以后): 1.THREAD_POOL_EXECUTOR, ...
  • ai_yong_jie
  • ai_yong_jie
  • 2016年08月04日 10:02
  • 2154

AsyncTask - 基本原理 后台线程和UI线程的交互

前面一个文章大概描述了一下任务是怎么被执行的?http://blog.csdn.net/zj510/article/details/51485120 其实也就是AsyncTask里面的doInBac...
  • zj510
  • zj510
  • 2016年05月24日 13:30
  • 601

AsyncTask 坑 (四) 多个task是串行执行还是并行的

AsyncTask作为一个优秀的封装,很多人都在用,可是我估计很多人并不清楚多个AsyncTask对象到底是串行执行的,还是并行执行的,如果是并行的,那么最多同时执行几个异步任务呢? 源码面前无秘密...
  • zj510
  • zj510
  • 2016年06月09日 21:12
  • 6457

android Asynctask的优缺点?能否同时并发100+asynctask呢?

AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI...
  • u012974916
  • u012974916
  • 2014年04月27日 11:24
  • 4789
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程---AsyncTask
举报原因:
原因补充:

(最多只允许输入30个字)