异步任务:是一个在后台线程上运行,其结果是在UI线程上显示的一种类
执行过程如图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3fb45f3c82aa59994c82537b59cd9ed0.png)
分为四步:
-
实现AsyncATask子类并创建对象
-
通过execute()方法启动子线程
-
onPreExecute()和inPostExecute方法不是必须重新,会在doInBackground()方法前后执行
-
doInBackground是真正执行子线程逻辑的方法
注:
-
doInBackground()也是不能执行UI的,执行UI线程的方法需要放在onProgressUpdate()方法中,执行的方法是在doInBackground中调用publishProgress()
-
实现AsyncTask子类需要注意的地方:继承时注意泛型,有三个泛型,顺序如下
- 传递到执行代码中的参数类型
- 在doInBackground中传递到onProgressUpdate中的参数类型
- doInBackground返回值类型,也是onPostExecute接收的参数类型
代码
创建:execute中的参数为传递到doInBackground中的
MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute("访问的网络地址");
实现AsyncTask子类
private class MyAsyncTask extends AsyncTask<String, Integer, String>{
@Override
protected void onPreExecute() {
Log.e("onPreExecute","所在的线程"+Thread.currentThread().getName());
super.onPreExecute();
}
@Override
protected String doInBackground(String[] objects) {
Log.e("doInBackground","所在的线程"+Thread.currentThread().getName());
Log.e("主线程传递的数据",objects[0]);
while (true) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(20);
if (currentProgress == 80){
break;
}
}
return "doInBackground执行的结果";
}
@Override
protected void onProgressUpdate(Integer[] values) {
Log.e("onProgressUpdate","所在的线程"+Thread.currentThread().getName());
Log.e("onProgressUpdate参数的值",values[0] + "");
currentProgress = progressBar.getProgress();
progressBar.setProgress(currentProgress + 20);
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String o) {
Log.e("onPostExecute","所在的线程"+Thread.currentThread().getName());
Log.e("onPostExecute参数的值",o);
super.onPostExecute(o);
}
}
可以在异步任务中模拟下载的进度条
简单实现需要五步:
-
在XML文件中搞一个ProgressBar组件
-
在java代码中获取ProgressBar的组件
-
设置其最大值(setMax)
-
得到当前进度(getProgress)
-
设置进度(setProgress)
有以下几点需要注意:
- XML中注意style样式
-
setMax时候如果设置为100,然后设置进度为50,进度条会显示一半,但如果setMax设为50,设置进度也为50,进度条会显示满