Android 解析AsyncTask(一)

Android 解析AsyncTask(一)

大家都知道在开发Android中涉及到UI的修改都必须在UI线程中操作,并且执行耗时的操作绝不能在UI线程上干,一般使用线程或者开启线程池处理。如果要把耗时的任务执行的结果显示到UI上,也许会使用Thread+Handler这种方式来处理,但是个人感觉其内聚性不是很高。而AsyncTask非常适合上述应用场景,它其实是Thread+Handler的结合体,通过它你可以执行耗时的操作,并把结果转移到UI线程中,甚至可以显示执行进度,下面阐述下它的基本使用方法。

使用

AsyncTask是个抽象类,如果你使用的话必须要实现doInBackground(Params…)方法,一般的话你也要复写onPostExecute(Result),下面给出一个简单的样例

 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);

AsyncTask的三种参数类型

当你继承AsyncTask时需要你指定三种参数类型

  1. Params, 就是AsyncTask执行时接受的可变参数类型,
    也是方法doInBackground传入的参数类型

  2. Progress 进度更新时传入的参数也是方法
    publishProgress、onProgressUpdate传入的参数

  3. Result 后台执行后返回的数据类型

如果你觉得不需要参数的话,你可以都用Void来代替

private class MyTask extends AsyncTask<Void, Void, Void> { ... }

AsyncTask执行的四步

当一个异步任务被执行时,AsyncTask会执行下述四个步骤:

  1. onPreExecute(),
    该方法会在UI线程中调用并且是在任务被执行前调用,你可以在这里去创建一个对话框显示其进度或者提示信息。

  2. doInBackground(Params…),
    当onPreExecute()调用结束后该方法立马被执行并且是运行在后台线程中。所以你可以在该方法中执行耗时的操作比如网络的请求,文件下载等等。该方法的参数就是你传入给AsyncTask的参数,执行后会返回结果,并会把结果传递给第四步。你可以在该方法中调用publishProgress(Progress…)去发布进度信息,该进度信息会被转移到onProgressUpdate(Progress…)方法中。

  3. onProgressUpdate(Progress…),
    调用publishProgress(Progress…)后该方法会在UI线程中被调用,该方法能够显示后台任务执行的进度消息等。

  4. onPostExecute(Result),
    后台任务执行完毕后将调用该方法,并将计算的结果以参数的形式转移给该方法。

取消一个任务

你可以通过调用cancel(boolean)来取消任务,调用它后onCancelled(Object)将会在doInBackground(Object[]) 返回之后被调用,onPostExecute(Object)则不会执行,为确保任务能够被及时取消,建议取消前使用isCancelled()方法判断当前任务是否被取消。

注意事项

  • AsyncTask必须在UI线程创建,且方法execute(Params…) 也必须在UI线程中使用
  • 不要手动调用 onPreExecute(), onPostExecute(Result), doInBackground(Params…), onProgressUpdate(Progress…) 方法
  • 任务仅仅能被执行一次,如果调用多次execute方法将会抛出异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值