欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

0309-AsyncTask知识点

程序员文章站 2022-05-14 19:30:10
...

一.什么是AsyncTask?

AsyncTask是安卓提供轻量级的异步类;

为了降低异步通信的开发难度,提供了AsyncTask;

AsyncTask直接继承于Object类,位于Android.os包;

使用AsyncTask可以直接忽略Looper、MessageQueue、

Handler等复杂对象、更便捷的完成异步耗时操作。

二、如何使用AsyncTask?

1.新建内部类继承AsyncTask

2.定义AsyncTask的三种泛型参数

3.重写doInBackgroud方法

4.重写onPreExecute方法

5.重写onProgressupdate方法

6..重写onPostExecute方法

7.在需要启动的地方execute方法

三、如何使用AsyncTask做倒计时?

带进度的AsyncTask中方法的调用顺序:

使用AsyncTask做倒计时首先要定义AsyncTask,

在UI线程中启动AsyncTask

初始化控件

在doInBackgroud中做耗时操作

在onProgressUpdate中得到进度设置控件进度

最后根据result设置控件,onPostExecute方法里更新UI

代码如下

在xml布局中设置控件
 <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:orientation="horizontal">
        <TextView
            android:layout_width="100dp"
            android:layout_height="50dp"
            android:textSize="25sp"
            android:text="设置时间"
            />
        <EditText
            android:id="@+id/ed_text"
            android:layout_width="50dp"
            android:layout_height="40dp"
            />
        <TextView
            android:id="@+id/se_tv"
            android:layout_width="100dp"
            android:layout_height="50dp"
            android:textSize="25sp"
            android:text="秒"
            />
    </LinearLayout>

    <TextView
        android:id="@+id/djs_tv"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:textSize="30sp"
        android:gravity="center"
        />
    <Button
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="开始计时"
        android:textSize="25sp"
        android:id="@+id/st_btn"
        />
 </LinearLayout>

初始化控件,做准备

 private EditText editText1;
    private TextView textView;
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_three);

        bindID();
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                int time=Integer.parseInt(editText1.getText().toString());
                new MyAsyncTask().execute(time);
            }
        });
    }

    private void bindID() {
        editText1=findViewById(R.id.ed_text);
        textView=findViewById(R.id.djs_tv);
        button=findViewById(R.id.st_btn);
    }

定义AsyncTask,在doInBackgroud中做耗时操作;

在onProgressUpdate中得到进度设置控件进度


    class MyAsyncTask extends AsyncTask<Integer,Integer,String> {


        @Override
        protected String doInBackground(Integer... params) {

            for (int i=params[0];i>0;i--){

                try {
                    Thread.sleep(1000);
                    publishProgress(i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "计时结束";
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            textView.setText(""+values[0]);
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            textView.setText(s);
        }
    }

0309-AsyncTask知识点

四、如何使用AsyncTask做进度条?

使用AsyncTask做倒计时要先定义AsyncTask,

在UI线程中启动AsyncTask

初始化控件

在doInBackgroud中做耗时操作

在onProgressUpdate中得到进度设置控件进度

最后根据result设置控件,onPostExecute方法里更新UI

代码如下:

xml中的代码很简单,只需要一个进度条和按钮即可


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.test.project.handlerapplication.Activityfour">


  <SeekBar
      android:id="@+id/probar"
      android:layout_width="match_parent"
      android:layout_height="wrap_content" />

    <Button
        android:id="@+id/start_Btn"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="开始下载"

        />

</LinearLayout>

java代码:

使用for循环做耗时操作

在onProgressUpdate中更新进度条

最后返回doInBackgroud的结果

package com.test.project.handlerapplication;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.SeekBar;

public class Activityfour extends AppCompatActivity implements View.OnClickListener {


    private Button startBtn;
    private ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_four);
        BindId();


    }

    private void BindId() {
        progressBar=findViewById(R.id.probar);
        startBtn = findViewById(R.id.start_Btn);
        startBtn.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {

        switch (view.getId()) {
            case R.id.start_Btn:

                new MyAsyncTask().execute();
                startBtn.setText("正在下载");
                startBtn.setEnabled(false);
                break;

        }
    }

    class MyAsyncTask extends AsyncTask<Integer, Integer, String> {
        @Override
        protected String doInBackground(Integer... integers) {

            for (int i=0; i <=10; i++) {
                try {
                    Thread.sleep(1000);
                    publishProgress(i*10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "下载结束";
        }


        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            startBtn.setText(s);
            startBtn.setEnabled(true);

        }
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            progressBar.setProgress(values[0]);

        }
    }
}

0309-AsyncTask知识点

五、Execute和executeonExecutor的区别?

使用execute方法启动时,下载任务是串行的,即必须等第一个下载完成后才能下载第二个;

使用executeOnExecutor启动时,可以进行并行执行,所有任务可以同步进行。

首先布置XML布局:

这里较第四点多了一个按钮和进度条



  <SeekBar
      android:id="@+id/probar"
      android:layout_width="match_parent"
      android:layout_height="wrap_content" />
  <SeekBar
      android:id="@+id/probar1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content" />

    <Button
        android:id="@+id/start_Btn"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="开始下载"

        />
    <Button
        android:id="@+id/start_Btn1"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="开始下载"

        />

布置java代码:

由于使用executeOnExecutor方法是用来启动多任务执行的,

所以用switch语句来分辨在onProgressUpdate里的进度条更新

在doInBackground做耗时操作里,定义一个动态参数whichpro,并返回这个参数,

让onPostExecute接收,更新UI。

再在按钮的点击事件中,使用executeOnExecutor方法。


package com.test.project.handlerapplication;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.SeekBar;

public class Activityfour extends AppCompatActivity implements View.OnClickListener {


    private Button startBtn;
    private Button startBtn1;

    private ProgressBar progressBar;
    private ProgressBar progressBar1;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_four);
        BindId();


    }

    private void BindId() {
        progressBar=findViewById(R.id.probar);
        startBtn = findViewById(R.id.start_Btn);
        startBtn1 = findViewById(R.id.start_Btn1);
        progressBar1=findViewById(R.id.probar1);
        startBtn.setOnClickListener(this);
        startBtn1.setOnClickListener(this);


    }

    @Override
    public void onClick(View view) {

        switch (view.getId()) {
            case R.id.start_Btn:
                new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,1);
                startBtn.setText("正在下载");
                startBtn.setEnabled(false);
                break;
                case R.id.start_Btn1:
                new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,2);
                startBtn1.setText("正在下载");
                startBtn1.setEnabled(false);
                break;
        }
    }

    class MyAsyncTask extends AsyncTask<Integer, Integer, Integer> {
        @Override
        protected Integer doInBackground(Integer... integers) {

            int whichpro=integers[0];
            for (int i=0; i <=100; i++) {
                try {
                    Thread.sleep(1000);
                    publishProgress(i,whichpro);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return whichpro;
        }


        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            switch (values[1]){
                case 1:
                    progressBar.setProgress(values[0]);
                    break;
                case 2:
                    progressBar1.setProgress(values[0]);
                    break;
            }

        }
        @Override
        protected void onPostExecute(Integer s) {
            super.onPostExecute(s);
            switch (s){
                case 1 :
                    startBtn.setText("下载完成");
                    startBtn.setEnabled(true);
                    break;
                case 2:
                    startBtn1.setText("下载完成");
                    startBtn1.setEnabled(true);
                    break;
            } ;


        }

    }
}

注意:同一时间只能同时进行5个任务

0309-AsyncTask知识点

最后,对于Handler和AsyncTask我更喜欢使用AsyncTask。

因为AsyncTask只需要了解三个参数,几个方法,代码量小,结构清晰。

相关标签: 异步