AsyncTask
1.什么是AsyncTask?
AsyncTask是Android提供的轻量级的异步类。
2.如何使用AsyncTask?
(1)新建内部类继承AsyncTask
(2)定义AsyncTask的三种泛型参数(注:泛型参数指任意类型的参数)
(3)重写doInBackground方法(完成耗时操作)
(4)重写onPreExcute方法
(5)重写onProgressUpdate方法
(6)重写onPostExcute方法
(7)在需要重启的地方调用excute方法
3.使用AsyncTask做倒计时
如图所示,这是用AsyncTask实现的计时器的程序。
xml文件中的代码如下:
<EditText android:gravity="center" android:textSize="40sp" android:id="@+id/setting_et" android:layout_width="match_parent" android:layout_height="100dp" /> <Button android:id="@+id/download_btn" android:layout_width="match_parent" android:layout_height="60dp" android:layout_centerInParent="true" android:text="开始计时" /> <TextView android:layout_below="@id/setting_et" android:id="@+id/window_tv" android:layout_width="match_parent" android:layout_height="50dp" android:textSize="30sp" android:gravity="center" android:text="倒计时" />
java文件中的代码如下:
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 AsyncTaskActivity extends AppCompatActivity { private Button downloadBTN; private TextView windowTV; private EditText settingET; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_async_task); bindID(); downloadBTN.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int time=Integer.parseInt(settingET.getText().toString());//将字符串转换成整形 new MyTask().execute(time); } }); } private void bindID() { downloadBTN = findViewById(R.id.download_btn); windowTV = findViewById(R.id.window_tv); settingET = findViewById(R.id.setting_et); } 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); windowTV.setText(values[0]+"" ); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); windowTV.setText(s); } } }
首先,我们先将xml文件中的控件声明,其次绑定ID。在onCreate生命周期中我们为Button设置监听事件。
我们创建一个MyTask类(括号中的3个参数可为任意类型),在此类中,我们创建出doInBackground,onProgressUpdate,onPostExcute 方法。
在doInBackground方法中我们创建一个for循环来实现计数的操作(耗时操作)
int time=Integer.parseInt(settingET.getText().toString());//将字符串转换成整形 new MyTask().execute(time);
该串代码为将字符串转换为整型与启动MyTask类
4.使用AsyncTask做进度条
我们用ProgressBar实现进度条效果。xml文件中的代码如下:
<ProgressBar android:id="@+id/pb1" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="10dp" android:layout_marginTop="50dp" android:max="200" android:progress="0" android:visibility="visible" /> <ProgressBar android:layout_below="@+id/pb1" android:id="@+id/pb2" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="10dp" android:layout_marginTop="50dp" android:max="200" android:progress="0" android:visibility="visible" /> <Button android:id="@+id/btn1" android:layout_width="200dp" android:layout_height="50dp" android:layout_centerInParent="true" android:text="开始下载" />
java文件中的代码如下:
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.ProgressBar; import android.widget.TextView; public class ProgressBarActivity 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_progress_bar); 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); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btn1: BTN1.setEnabled(false); BTN1.setText("正在下载"); new MyTask().execute(); break; } } class MyTask extends AsyncTask<Integer, Integer, Integer> { @Override protected Integer doInBackground(Integer... integers) { for (int i = 0; i < 10; i++) { try { Thread.sleep(1000); publishProgress(i); } catch (InterruptedException e) { e.printStackTrace(); } } return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); PB1.setProgress(values[0]); } @Override protected void onPostExecute(Integer integer) { super.onPostExecute(integer); BTN1.setText("下载完成"); BTN1.setEnabled(true); } } }
如同倒计时程序,首先声明控件,然后绑定ID,在doInBackground生命周期中用for循环实现计数操作。
5.Excute和excuteOnExcutor的区别
Excute(),是串行,excuteOnExcutor是并行(最多5个同时进行)
6我更喜欢,AsyncTask,因为它更简洁。