一.什么是AsyncTask?
1.AsyncTask是Android提供轻量级(实现代码量少)的异步类;
2.为了降低异步通信的开发难度,提供了AsycTask;
3.AsyncTask直接继承于Object类,位于android.os包中;
4.使用AsyncTask可以忽略Looper MessageQueue Handler等复杂的对象,更便捷的完成异步耗时操作。
AsyncTask的泛型参数和常用方法
AsyncTask的三种泛型参数:
Params:启动任务执行的输入参数;
Progress:后台任务执行的额百分比;
Result:后台执行任务最终返回的结果。
常用方法:
onPreExecute:
1.异步任务开始执行时,系统最先调用此方法;
2.此方法运行在主线程中,可以对控件进行初始化等操作。
doInBackground:
1.执行完onPreExecute方法后,系统执行此方法。
2.此方法运行在主线称中,比较耗时的操作放在此方法中执行。
onProgressUpdate:
1.显示当前进度,适用于下载或扫描这类需要实时显示进度的需求;
2.此方法运行在主线程中,可以修改控件状态,例如:显示百分比;
3.触发此方法,需要在doInBackground中使用publishProgress方法。
publishProgress:
1.在doInBackground中使用;
2.用于触发onProgress方法
onPostExecute:
1.当异步任务执行完成后,系统会自动调用此方法;
2.此方法运行在主线程中,可以修改控件状态,例如:下载完成。
二.如何使用AsyncTask?
AsyncTask的执行过程:UI线程 - 启动AsynsTask - 执行耗时操作 - 接受消息。
1.新建内部类继承AsykcTask;
2.定义AsyckTask的三种泛型参数;
3.重写doInBackground抽象方法;
4.重写onPostExecute方法;
5.重写onProgreeUpdate方法;
6.重写onPreExecute方法;
7.在需要启动的地方调用execute方法。
三.使用AsyncTask做倒计时(附代码)
public class MainActivity extends AppCompatActivity { private EditText timeet; private TextView timetv; private Button daojishibtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindID(); daojishibtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int time=Integer.parseInt(timeet.getText().toString());//把int类型转换成String类型 new MyTask().execute(time); } }); } private void bindID() { timeet=findViewById(R.id.time_et); timetv=findViewById(R.id.time_tv); daojishibtn=findViewById(R.id.daojishi_btn); } class MyTask extends AsyncTask<Integer,Integer,String>{ @Override protected String doInBackground(Integer... Integer) { for(int i=Integer[0];i>0;i--){ try{ Thread.sleep(1000); publishProgress(i);//调用onProgressUpdate方法 } catch (InterruptedException e) { e.printStackTrace(); } } return "计时结束"; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); timetv.setText("倒计时:"+values[0]); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); daojishibtn.setText(s); } } }布局:
<EditText android:id="@+id/time_et" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/time_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/daojishi_btn" android:layout_width="match_parent" android:layout_height="50dp" android:text="带进度AsyncTask倒计时"/> </LinearLayout>四.使用AsckyTask做进度条(附代码) <ProgressBar android:id="@+id/pb1" style="@style/Widget.AppCompat.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" /> <ProgressBar android:id="@+id/pb2" style="@style/Widget.AppCompat.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" /> <Button android:id="@+id/btn1" android:layout_width="match_parent" android:layout_height="50dp" android:text="开始下载"/> <Button android:id="@+id/btn2" android:layout_width="match_parent" android:layout_height="50dp" android:text="开始下载"/> </LinearLayout> 布局: public class Jindutiao extends AppCompatActivity implements View.OnClickListener{ private Button btn1; private Button btn2; private ProgressBar pb1; private ProgressBar pb2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_jindutiao); bindID(); } private void bindID() { btn1=findViewById(R.id.btn1); btn2=findViewById(R.id.btn2); pb1=findViewById(R.id.pb1); pb2=findViewById(R.id.pb2); btn1.setOnClickListener(this); btn2.setOnClickListener(this); pb1.setMax(10);//设置最大值 pb2.setMax(10);//设置最大值 } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn1: btn1.setEnabled(false); btn1.setText("正在下载"); new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,1);//改成并行 break; case R.id.btn2: btn2.setEnabled(false); btn2.setText("正在下载"); new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,2);//改成并行 break; } } class MyTask extends AsyncTask<Integer,Integer,Integer>{ @Override protected Integer doInBackground(Integer... integers) { int whichpb=integers[0];//定义任意一个数两步 for(int i=1;i<=10;i++){ try { Thread.sleep(1000); publishProgress(i,whichpb);//添加任意数 } catch (InterruptedException e) { e.printStackTrace(); } } return whichpb;//返回至任意一个数 } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); //定义两个进度条进行 switch (values[1]){ case 1: pb1.setProgress(values[0]); break; case 2: pb2.setProgress(values[0]); break; } } @Override protected void onPostExecute(Integer integer) { super.onPostExecute(integer); //定义选择两个下载按钮 switch (integer){ case 1: btn1.setText("下载完成"); btn1.setEnabled(true); break; case 2: btn2.setText("下载完成"); btn2.setEnabled(true); break;} } } }五.Excute和excuteOnExcutor的区别:
Excute实现的是串行,excuteOnExcutor实现的是并行。
六.更喜欢AsckyTask还是Handler,为什么?
更喜欢AsckyTask,因为使用AsckyTask,简单,快捷,适用于下载,获取网络数据这样的场景。