- AsyncTask是什么
- AsyncTask怎么用
- 需要实现的几个方法分别是什么
- 什么是泛型参数
- 什么是长度可变参数列表
- 案例解析――倒计时Demo
什么是AsyncTask
1.AsyncTask是Android提供的轻量级(实现代码量少)的异步类
2.为了降低异步通信的开发难度,提供了AsyncTask。
3.AsyncTask直接继承Object类,位于android.os包中。
4.使用AsyncTask可以忽略Looper、MessageQueue、Handler等复杂对象,更便捷的完成异步耗时的操作。
AsyncTask怎么用
1.新建内部类继承AsyncTask;
2.定义AsyncTask的三种泛型参数;
3.重写DoInBackground抽象方法;
4.重写onPreExecute方法;
5.重写onProgressUpdate方法;
6.重写onPostExecute方法;
7.需要调用的地方启用execute方法
AsyncTask的泛型参数和常用方法
AsyncTask三种泛型参数
Params:启动任务执行的输入参数
Progress:后台任务执行的百分比
Result:后台执行任务最终返回的结果
onPreExecute方法
1.异步任务开始执行时,系统最先调用此方法。
2.此方法运行在主线程中,可以对控件进行初始化等操作。
doInBackground方法
1.执行完onPreExecute方法后,系统执行此方法。
2.此方法运行在子线程中,比较耗时的操作放在此方法中执行。
onProgressUpdate方法
1.显示当前进度,适用于下载或扫描这类需要实时显示进度的需求。
2.此方法运行在主线程中,可以修改控件状态,例如:显示百分比。
3.触发此方法,需要在doInBackground中使用publishProgress方法。
onPostExecute方法
1.在异步任务执行完成后,系统会调用此方法。
2.此方法运行在主线程中,可以修改控件状态,例如:下载完成。
什么是长度可变参数列表
private void removeTempFiles(String... fileNames) { for (String fileName : fileNames) { try { new File(fileName).delete(); } catch (Exception e) { } } }
String后面的三个点就是代表可变参数,调用的时候可以随便写参数个数,适合不指定性参数
倒计时代码
ackage com.example.myapplication; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class DownloadTaskActivity extends AppCompatActivity { private TextView task_tv; private Button task_btn; private int count=10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_download_task); task_tv = findViewById(R.id.task_tv); task_btn = findViewById(R.id.task_btn); task_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new DownloadTask().execute(); } }); } class DownloadTask extends AsyncTask<String, String, String> { //启动前 @Override protected void onPreExecute() { super.onPreExecute(); task_tv.setText("正在下载"); } //这个方法一定要重写 @Override protected String doInBackground(String... strings) { while (count>0){ publishProgress(count+""); count--; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } return "下载完成"; } @Override protected void onProgressUpdate(String... values) { super.onProgressUpdate(values); task_tv.setText(values[0]); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); task_tv.setText(s); } }