3.9学习内容-AsyncTask的定义和使用

xiaoxiao2021-02-28  36

一.什么是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,简单,快捷,适用于下载,获取网络数据这样的场景。

转载请注明原文地址: https://www.6miu.com/read-2100015.html

最新回复(0)