AsyncTask能够适当地、简单地用于UI线程,这个类准许执行后台操作。
异步任务的定义是一个在后台线程上运行,其结果是在UI线程上显示的一种类。
还是会创建线程的,不过是封装了起来,看不到罢了。
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界面。
# AsyncTask的创建• 异步任务中的三个泛型:
- 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{
//用了泛型,下面的方法的参数也需要相应的变换
------------------------------------------------
@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
本菜鸟今天也要努力变强
原创文章 65获赞 3访问量 4344
关注
私信
展开阅读全文