一、什么是AsyncTask
AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并主线程中更新UI,通过AsyncTask可以更加方便执行后台任务以及在主线程中访问UI,但是AsyncTask并不适合进行特别耗时的后台任务,对于特别耗时的任务来说,建议使用线程池。
二、如何使用AsyncTask
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
三、使用AsyncTask做倒计时
package com.example.administrator.handlerdemo; 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.EditText; import android.widget.TextView; public class Main2Activity extends AppCompatActivity { private Button daojishiBtn; private EditText daojishiET; private TextView daojishiTv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); bindID(); daojishiBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int time = Integer.parseInt(daojishiET.getText().toString()); new MyTask().execute(time); } }); } private void bindID() { daojishiBtn=findViewById(R.id.daojishi_btn); daojishiET=findViewById(R.id.daojishi_et); daojishiTv=findViewById(R.id.daojishi_tv); } class MyTask extends AsyncTask<Integer,Integer,String>{ @Override protected String doInBackground(Integer... integers) { for (int i=integers[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); daojishiTv.setText(values[0]+""); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); daojishiTv.setText(s); } } }
四、使用AsyncTask做进度条
package com.example.administrator.handlerdemo; 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.EditText; import android.widget.ProgressBar; import android.widget.TextView; public class JinduActivity extends AppCompatActivity implements View.OnClickListener{ private ProgressBar pb1; private Button btn1; private ProgressBar pb2; private Button btn2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_jindu); bindID(); } private void bindID() { btn1=findViewById(R.id.btn1); pb1=findViewById(R.id.pb1); btn2=findViewById(R.id.btn2); pb2=findViewById(R.id.pb2); 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; } } } }
五、Execute和executeOnExecute有何区别
方法execute:
用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能
execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程 或动态执行未知 SQL 字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。
方法executeUpdate
用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
六、更喜欢AsyncTask还是更喜欢Handler,为什么?
更喜欢AsyncTask
使用的优点:
1.简单,快捷
2. 过程可控
AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。
AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)
AsyncTask定义了三种泛型类型 Params,Progress和Result。