# 简介
AsyncTask能够适当地、简单地用于UI线程,这个类准许执行后台 *** 作。
异步任务的定义是一个在后台线程上运行,其结果是在UI线程上显示的一种类。
还是会创建线程的,不过是封装了起来,看不到罢了。
execute();
启动异步任务的方法(子线程)
# 异步任务执行时对应的四个方法:# onPreExecute():多用于初始化任务被执行之前调用UI线程。• 这步通常被用于设置任务,例如在用户界面显示一个进度条。
# doInBackground(Params…):在子线程中执行(后台中执行 *** 作)onPreExecute()执行完成,立刻调用后台线程。### 线程名称是 AsyncTask #1 自动定义的 ###• 这步被用于执行较长时间的后台任务;• 异步任务的参数也被传到这步;• 计算的结果在这步返回,将传回到上一步
# onProgressUpdate(Progress…):一次呼叫### 唯一不能自动调用的方法 ###需要调用另外一个方法,就是下面的那个方法。publishProgress(Progress...)后调用UI线程,执行的时机没有定义。• 这个方法用于在用户界面显示进度,当后台计算还在进行时。• 例如:这个方法可以被用于一个进度条动画或在文本域显示日志。
@L_419_13@# onPostExecute(Result):当后台计算结束时,调用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" /> </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界面。
# 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<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
总结 以上是内存溢出为你收集整理的Android 第三章 第二节 多线程 ( AsyncTask )全部内容,希望文章能够帮你解决Android 第三章 第二节 多线程 ( AsyncTask )所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)