AsyncTask小结

1.AsyncTask是什么

一个Handler和线程池的封装,线程池用来异步处理后台任务,handler用来发送消息进行UI方面的交互。

2.AsyncTask怎么用

通过一个类继承AsyncTask方法,在方法里实现异步处理;

3.需要实现的结果方法分别是什么,有什么用

//在doInBackground之前调用,在UI线程内执行
@MainThread
protected void onPreExecute() {
}
//在执行中,且在调用publishProgress方法时,在UI线程内执行,用于更新进度
@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>

猜你喜欢

转载自blog.csdn.net/xfscy/article/details/80616478