android|android 多线程 — AsyncTask 使用
AsyncTask android 提供的典型的用来实现异步任务的类,直接来看如何使用
如何使用
- AsyncTask 是一个 abstract 抽象基类,我们必须写一个异步任务类继承 AsyncTask
class DownloadTask extends AsyncTask {
@Override
protected void onPreExecute() {
progressDialog.show();
}@Override
protected Boolean doInBackground(Void... params) {
try {
while (true) {
int downloadPercent = doDownload();
publishProgress(downloadPercent);
if (downloadPercent >= 100) {
break;
}
}
} catch (Exception e) {
return false;
}
return true;
}@Override
protected void onProgressUpdate(Integer... values) {
progressDialog.setMessage("当前下载进度:" + values[0] + "%");
}@Override
protected void onPostExecute(Boolean result) {
progressDialog.dismiss();
if (result) {
Toast.makeText(context, "下载成功",Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "下载失败",Toast.LENGTH_SHORT).show();
}
}
}
- 在 UI 线程中,new 一个这个 AsyncTask 实现类的对象,然后启动
new DownloadTask().execute();
类声明中的泛型解释
在我们声明这个 DownloadTask 继承 AsyncTask 类的时候,有3个泛型
class DownloadTask extends AsyncTask{
....
}
- 第一个泛型 : 表示传入的原始参数类型
- 第一个泛型 : 表示后台任务中间执行进度的数据类型,比如可以用在下载中
- 第一个泛型 : 表示最终返回结果的数据类型
- 若是没有参数:那么在相应位置可以写 Void
- onPreExecute()
代理 相关的准备任务,运行在 UI 线程,在后台任务前运行。
- doInBackground(Params)
代理 异步任务,运行在独立的线程中,期中可以使用 publishProgress(downloadPercent) 方法更新任务进度,比如下载任务,最后把获取都的数据返回, 没有返回 null
- onProgressUpdate(Progress...)
用于更新进度,运行在 UI 线程
- onPostExecute(result)
获取最终结果,运行在 UI 线程
- AsyncTask 的实例必须在UI 线程中创建
- execute方法必须在UI 线程中调用
- 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,没意义不会按我们想的去执行,他们都是作为回调函数在相应的位置执行才有效
- AsyncTask 对象只能被执行一次,否则多次调用时将会出现异常
推荐阅读
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- android第三方框架(五)ButterKnife
- 爱就是希望你好好活着
- 昨夜小楼听风
- 知识
- 死结。
- 我从来不做坏事
- 烦恼和幸福
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- Android中的AES加密-下