AsyncTask 异步线程 用法
AsyncTask介绍
Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。
AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
public class MyAsyncTask extends AsyncTask<Integer, Integer, Integer> {....}
根据我们的需要重写以下方法:
(1)doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。(此方法必须重写)
(2)onPostExecute(Result) 相当于Handler 处理UI的方式,方法参数就是在doInBackground 得到的处理结果,此方法在主线程执行可以操作UI。
(3)onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。(如果是用此方法必须在doInBackground方法中使用publicProgress它传入进度值)
(4)onPreExecute() 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
(5)onCancelled() 用户调用取消时被触发。
注意以下情况:
(1)AsyncTask的实例必须在UI thread中创建;
(2)execute方法必须在UI thread中调用;同一个实例只能执行一次execute方法。多次调用时将会抛出异常。
例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class MyAsyncTask extends AsyncTask<Integer, Integer, Integer> { TextView txtView; ProgressBar pb; public MyAsyncTask(TextView txtView, ProgressBar pb) { this.txtView = txtView; this.pb = pb; } /** * 后台执行方法,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行, * 完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress()来更新任务的进度。 * 这里的参数对应AsyncTask的第一个参数, 这里的返回值对应AsyncTask,第三个参数。 */ @Override protected Integer doInBackground(Integer... params) { int num = 0; for (int i = 0; i < params[0]; i++) { num += i; publishProgress(i);// 注意:如果要在onProgressUpdate方法更新处理进度。这个方法必须加。 try { Thread.sleep(500);// 模拟任务处理时间 } catch (InterruptedException e) { e.printStackTrace(); } } return num; } /** * 这里的Integer参数对应AsyncTask中的第三个参数(这个值就是doInBackground的返回值) * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置 */ @Override protected void onPostExecute(Integer result) { txtView.setText("结果:" + String.valueOf(result)); super.onPostExecute(result); } /** * 当任务执行之前开始调用此方法,可以在这里提示用户任务已经开始执行了。 该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置 */ @Override protected void onPreExecute() { txtView.setText("请稍等那边正在处理呢"); super.onPreExecute(); } /** * 进度更新方法,此方法运行在UI线程中,因此可以操作UI * 这里的参数是在doInBackground方法中通过publishProgress方法传入的。 */ @Override protected void onProgressUpdate(Integer... values) { pb.setProgress(values[0]); super.onProgressUpdate(values); } /** * 取消AsyncTask任务时出发。Integer参数是取消的时候doInBackground已经处理的结果。 */ @Override protected void onCancelled(Integer result) { super.onCancelled(result); } }
在Acitivity中调用
MyAsyncTask task=new MyAsyncTask(txtview1,progressBar1);
task.excute(1000);//对应AsyncTask的第一个参数
task.cancel(boolean);//取消任务,这个方法很有意思。有兴趣的可以查查。