1.AsyncTask是什么
一个Handler和线程池的封装,线程池用来异步处理后台任务,handler用来发送消息进行UI方面的交互。
2.AsyncTask怎么用
通过一个类继承AsyncTask方法,在方法里实现异步处理;
3.需要实现的结果方法分别是什么,有什么用
//在doInBackground之前调用,在UI线程内执行
@MainThread
protected void onPreExecute() {
}
//在执行中,且在调用publishProgress方法时,在子线程内执行,用于更新进度
@MainThread
protected void onProgressUpdate(Progress... values) {
}
//在doInBackground之后调用,在UI线程内执行
@MainThread
protected void onPostExecute(Result result) {
}
.execute();开始执行
5.什么是长度可变的参数列表
类型后面三个点例如String…
后面的变量成为数组,例如
private void Bind(String... strings) {
}
Bind("0","1");
//括号里的值可以为空,也可以为"0",也可以为"0","1","2"
这样的效果就是长度可变的参数列表
6.案列解析———倒计时Demo
package com.example.demo5;
import android.os.AsyncTask;
import android.os.Binder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class Demo2Activity extends AppCompatActivity {
private TextView demo2_tv;
private Button demo2_btn;
private int count=10;//赋一个10秒的值
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo2);
demo2_btn = findViewById(R.id.demo2_btn);
demo2_tv = findViewById(R.id.demo2_tv);
//设置监听事件
demo2_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new MyTask().execute();//执行MyTask
}
});
}
private class MyTask extends AsyncTask<String, String, String> {
//先更新ui
@Override
protected void onPreExecute() {
super.onPreExecute();
demo2_tv.setText("正在下载");
}
//子线程执行耗时操作,同时调用publishProgress方法
@Override
protected String doInBackground(String... strings) {
while (count>0){
publishProgress(count+"");
count--;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "下载完成";
}
//更新ui操作
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
demo2_tv.setText(values[0]);
}
//子线程结束,修改ui,s是doInBackground()方法return的值
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
demo2_tv.setText(s);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".Demo2Activity">
<TextView
android:id="@+id/demo2_tv"
android:layout_width="match_parent"
android:layout_height="40dp"
/>
<Button
android:id="@+id/demo2_btn"
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="开始下载"/>
</LinearLayout>
7.案例解析———下载进度条
package com.example.demo5;
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;
public class Main3Activity extends AppCompatActivity implements View.OnClickListener {
private ProgressBar main3_pb1;
private ProgressBar main3_pb2;
private Button main3_btn1;
private Button main3_btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
bindID();//绑定Id
main3_btn1.setOnClickListener(this);
main3_btn2.setOnClickListener(this);
}
private void bindID() {
main3_btn1 = findViewById(R.id.main3_bn1);
main3_btn2 = findViewById(R.id.main3_bn2);
main3_pb1 = findViewById(R.id.main3_pb1);
main3_pb2 = findViewById(R.id.main3_pb2);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.main3_bn1:
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,1);
main3_btn1.setEnabled(false);
/*启动MyTask,executeOnExecutor(启动子线程同时运行)
execute()(子线程一个一个运行,如排队)
(AsyncTask.THREAD_POOL_EXECUTOR
(使子线程同时运行,可以运行的数量上限为5个),1(传递一个标记,判断是点击了哪个按钮))
*/
break;
case R.id.main3_bn2:
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,2);
main3_btn2.setEnabled(false);
break;
}
}
//<Integer, Integer(接收到的值), Integer>
class MyTask extends AsyncTask<Integer, Integer, Integer> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Integer doInBackground(Integer... strings) {
int count=0;
while (count <= 100) {
count += 10;
publishProgress(count,strings[0]);
//传递给onProgressUpdate方法
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return strings[0];//返回一个Integer的值
}
@Override
protected void onProgressUpdate(Integer... values) {
//values[0]即为count,values[1]即为string[0]
super.onProgressUpdate(values);
if (values[1]==1){
main3_pb1.setProgress(values[0]);
} if (values[1]==2){
main3_pb2.setProgress(values[0]);
}
}
//s即为接收的doInBackground返回的值
@Override
protected void onPostExecute(Integer s) {
super.onPostExecute(s);
if (s==1){
main3_btn1.setText("下载完成");
main3_btn1.setEnabled(true);
}
if (s==2){
main3_btn2.setText("下载完成");
main3_btn2.setEnabled(true);
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".Demo3Activity">
<ProgressBar
android:id="@+id/demo3_pb1"
android:layout_width="match_parent"
android:layout_height="5dp"
android:max="100"
style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
/>
<Button
android:id="@+id/demo3_bn1"
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="开始下载"/>
<ProgressBar
android:id="@+id/demo3_pb2"
android:layout_width="match_parent"
android:layout_height="5dp"
android:max="100"
style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
/>
<Button
android:id="@+id/demo3_bn2"
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="开始下载"/>
</LinearLayout>