异步任务

异步任务
因为android ui的线程安全问题,因此当我们需要执行耗时的操作时,一定要在新线程中进行,否则会对主线程造成阻塞,android默认的是当ui线程超过20秒,就会引发anr(application not response)异常,为了解决这个问题,其实不仅仅可以使用Handler这一种方法,方法还有:
  1.使用Hanlder实现进程之间的通信。
  2.Acitvity.runOnUiThread(Runnable)
  3.View.pose(Runnable)
  4.View.poseDelayed(Runnable,long)
  5.AsyncTask<>
 据说是2.3.4方法有点繁琐,但是我认为也不一定都是。
 下面介绍方法5:
  AsyncTask<>是一个抽象类,通常用于被继承,但是继承时需要指定如下三个泛型参数。
  AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助于线程和Handler即可实现。
  三个泛型参数:
   Params:启动任务(相当于主线程)执行的输入参数集合。
   Progress:后台任务完成的进度值类型。
   Result:后台执行任务完成后返回的结果类型。
 使用AsyncTask只需要如下的三步:
  一.创建AsyncTask的子类,并为三个泛型参数指定类型,如果某个参数不需要指定类型,可将他指定为void。
  二.根据需要,实现AsyncTask的如下方法:
   1.doInBackground(Params):重写该方法就是后台线程将要完成的任务,该方法可以调用publishProgress(Progress values)更新任务的执行进度。
   2.onProgressUpdate(Progress values):在doInBackground(Params)方法中调用publishProgress(Progress values)方法更新任务的执行进度后,会触发该方法。
   3.onPreExecute():该方法将在执行后台耗时操作前被调用,该方法通常用于完成一些初始化的准备工作,比如在界面上显示进度条等。
   4.onPostExecute(Result result):当doInBackground完成后,系统会自动调用onPostExecute()方法,并将doInBackground()方法的返回值传给该方法。
  三,调用AsyncTask子类的实例的execute(Params...params)开始执行耗时的任务,但是必须遵守以下的一些规定。
   1.必须在ui线程中创建AsyncTask的实例
   2.必须在ui线程中调用AsyncTask的execute()方法
   3.上面所说的几种方法,不应该由程序员调用,而应该由系统调用。
   4.每个AsyncTask只能被执行一次,多次调用将引发异常。


参考文档《android疯狂讲义》

你可能感兴趣的:(android,UI,异步,AsyncTask,ANR)