AsyncTask能够适当地、简单地用于UI线程,这个类准许执行后台操作。
异步任务的定义是一个在后台线程上运行,其结果是在UI线程上显示的一种类。
还是会创建线程的,不过是封装了起来,看不到罢了。
execute();
启动异步任务的方法(子线程)
多用于初始化
任务被执行之前调用UI线程。
• 这步通常被用于设置任务,例如在用户界面显示一个进度条。
在子线程中执行(后台中执行操作)
onPreExecute()执行完成,立刻调用后台线程。
### 线程名称是 AsyncTask #1 自动定义的 ###
• 这步被用于执行较长时间的后台任务;
• 异步任务的参数也被传到这步;
• 计算的结果在这步返回,将传回到上一步
### 唯一不能自动调用的方法 ###
需要调用另外一个方法,就是下面的那个方法。
publishProgress(Progress...)后调用UI线程,执行的时机没有定义。
• 这个方法用于在用户界面显示进度,当后台计算还在进行时。
• 例如:这个方法可以被用于一个进度条动画或在文本域显示日志。
计算结果作为一个参数传递到此方法中。
四大方法的使用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//启动异步任务
MyAsyncTask myAsyncTask=new MyAsyncTask();
myAsyncTask.execute();
}//-------------------------------------onCreate
//定义异步任务类,继承自AsyncTask(抽象类)类
private class MyAsyncTask extends AsyncTask{
@Override
protected void onPreExecute() {
Log.e("onPreExecute","线程名城为:"+Thread.currentThread().getName());
super.onPreExecute();
}
@Override//四个方法中必须重写的方法,其他方法可以选择实现------/-/-/-/-/-/-/-/-/-/-/-/
protected Object doInBackground(Object[] objects) {
Log.e("doInBackground","线程名城为:"+Thread.currentThread().getName());
//执行四大方法之一的onProgressUpdate方法
publishProgress();
return null;
}
@Override//只有这个方法需要手动调用,在四大方法之一的doInBackground中调用
protected void onProgressUpdate(Object[] values) {
Log.e("onProgressUpdate","线程名城为:"+Thread.currentThread().getName());
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Object o) {
Log.e("onPostExecute","线程名城为:"+Thread.currentThread().getName());
super.onPostExecute(o);
}
}//------------------------------------AsyncTaks
}//--------------------------------------MainActivity
结果是:
E/onPreExecute: 线程名城为:main
E/doInBackground: 线程名城为:AsyncTask #1------自动命名的
E/onProgressUpdate: 线程名城为:main
E/onPostExecute: 线程名城为:main
进度条操作的实现
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<!--
进度条的实现,默认样式是圆形,通过style可改变形状
-->
<ProgressBar
android:id="@+id/activity_main_progressbar1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
/>
</LinearLayout>
public class MainActivity extends AppCompatActivity {
//实现进度条
private ProgressBar progressBar1; 进度条id
private int jindu; 自定义的整数,表示进度
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar1=findViewById(R.id.activity_main_progressbar1); //绑定id
//初始化进度条
progressBar1.setMax(100);
//启动异步任务
MyAsyncTask myAsyncTask=new MyAsyncTask();
myAsyncTask.execute();
}//--------------------------------------------------------------------------------onCreate
//定义异步任务类,继承自AsyncTask(抽象类)类
private class MyAsyncTask extends AsyncTask{
@Override//四个方法中必须重写的方法,其他方法可以选择实现------/-/-/-/-/-/-/-/-/-/-/-/
protected Object doInBackground(Object[] objects) {
//线程等待
while(true){
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}//执行四大方法之一的onProgressUpdate方法
if(jindu==80){
//进度100的时候跳出
break;
}
publishProgress();
}
return null;
}
@Override//只有这个方法需要手动调用,在四大方法之一的doInBackground中调用
protected void onProgressUpdate(Object[] values) {
jindu=progressBar1.getProgress();//int型jindu==进度条id的get方法。
progressBar1.setProgress(jindu+20);//进度条+20
super.onProgressUpdate(values);
Log.e("1111111111111111111",jindu+"");
}
}//------------------------------------------------------------------AsyncTaks
}//------------------------------------------------------------------------------------MainActivity
AsyncTask必须被子类继承。
• 子类至少重写其中的doInBackground(Params…)方法,一般还会重写onPostExecute(Result)。
任务实例必须创建在UI线程。
execute(Prams…)必须在UI线程上调用。
不要手动调用onPreExecute(), onPostExecute(),
doInBackground(), onProgressUpdate()。
不能在doInBackground(Params… params)中更改UI界面。
• 异步任务中的三个泛型:
- Params:任务执行器需要的数据类型。
- Progress:后台计算中使用的进度单位数据类型。
- Result:后台计算返回结果的数据类型。
上一个基础上实现了泛型的应用
方法细讲,参数的传递与类型
public class MainActivity extends AppCompatActivity {
//实现进度条
private ProgressBar progressBar1;
private int jindu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar1=findViewById(R.id.activity_main_progressbar1);
//初始化进度条
progressBar1.setMax(100);
//启动异步任务
MyAsyncTask myAsyncTask=new MyAsyncTask();
//myAsyncTask.execute();
myAsyncTask.execute("自定义参数,访问的网络地址");//参数的值会传入doInBackgroud方法
}//--------------------------------------------------------------------------------onCreate
//定义异步任务类,继承自AsyncTask(抽象类)类
//如果不指定泛型类型的话,方法中所有形参与返回值类型都是object
private class MyAsyncTask extends AsyncTask<String, Integer, String>{
//用了泛型,下面的方法的参数也需要相应的变换
------------------------------------------------
@Override//四个方法中必须重写的方法,其他方法可以选择实现------/-/-/-/-/-/-/-/-/-/-/-/
protected String doInBackground(String[] objects) {
Log.e("主线程传递的数据",objects[0]);//参数放入了数组里面
//线程等待
while(true){
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}//执行四大方法之一的onProgressUpdate方法
if(jindu==80){
//进度100的时候跳出
break;
}
publishProgress(20);//可以没有参数,有参数的话,参数会出现在onProgressUpdate方法参数的values【0】位置
}
// publishProgress();//会执行onProgressUpdate方法
//return的参数会传入onPostExecute方法中
return "doInBackground执行的结果";
}
------------------------------------------------
@Override//只有这个方法需要手动调用,在四大方法之一的doInBackground中调用
protected void onProgressUpdate(Integer[] values) {
jindu=progressBar1.getProgress();//int型jindu==进度条id的get方法。
progressBar1.setProgress(jindu+20);//进度条+20
super.onProgressUpdate(values);
Log.e("1111111111111111111",jindu+"");
Log.e("onProgressUpdate参数的值",values[0] + "");
}
------------------------------------------------
@Override
protected void onPostExecute(String o) {
Log.e("onPostExecute参数的值",o);//o是doInBackgroud方法的返回值
super.onPostExecute(o);
}
}//------------------------------------------------------------------AsyncTaks
}//------------------------------------------------------------------------------------MainActivity