基本用法
AsyncTask<Params, Progress, Result>是一个抽象类,需要继承后自行实现对应的方法。三个参数都是泛型,参数含义:1)Params,执行AsyncTask时传入的参数,可用于后台任务。2)Progress,执行后台任务在界面上显示进度的单位,类型有Integer,Float等。3)Result,执行完任务后若需要返回数据,则以Result的类型返回。
需要重写的方法
1.onPreExecute(),在后台任务开始之前调用,可以用于做界面上的初始化操作,如显示进度条。
2.doInBackground(Params),此方法中的所有代码都在子线程中运行,所有逻辑操作完成之后可以使用return 语句返回,若Result指定的是Void 类型,可以不返回结果。此方法不可用于UI操作,若需要更新UI如更新进度,可以调用publishProgress(Progress...)方法来进行。
3.onProgressUpdate(Progress...),当后台任务调用了publishProgress()方法后,这个方法会被调用。此方法中可以进行UI操作。
4.onPostExecute(Result...),当后台任务使用return语句将结果返回时,此方法很快被调用,return返回的数据作为参数传入此方法中。可以利用返回的参数来进行UI操作 ,如关闭进度条等。
执行过程(26--8.0为例)
execute(Params...params)开始执行,
——> executeOnExecutor(sDefaultExecutor, params)
——>onPreExecute(),sDefaultExecutor(实现了Executor接口的SerialExecutor的实例)的execute(mFuture)方法(mFuture间接继承了runnable)
——>会调用mFuture(FutureTask)的run()方法——>调用Callable的call()方法,也就是调用了WorkerRunnable的call()方法
——>Process.setThreadPriority(),调用doInBackground(params)方法并将得到的结果赋值给result,之后调用postResult(result)
——>Looper.getMainHandler.obtainMessage()方法获取Message实例,参数是MESSAGE_POST_RESULT常量 和代表执行结果的AsyncTaskResult的一个实例对象,并将message发送出去
——>AsyncTask的内部类InternalHandler的handleMessage()方法,在handlerMessage()方法内部,根据message携带的参数what来决定执行onProgressUpdate()或者是finish(result)方法,在finish(result)中,若当前任务取消则执行onCancelled(result)方法,否则执行onPostExecute(result),整个任务完成。
注意到publishProgress()方法中,发送出的消息携带的参数what是MESSAGE_POST_PROGRESS,从而会调用onProgressUpdate()方法。
网友评论