Android AsyncTask详解

Posted shineyoung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android AsyncTask详解相关的知识,希望对你有一定的参考价值。

android AsyncTask是一个轻量级的异步任务处理类

常见的使用步骤->创建一个继承自AsyncTask类的异步任务处理类

技术图片

 (AsyncTask<Params,Progress,Result>

Params启动任务执行的输入参数,比如一组URL

Progress后台任务执行的百分比

Result执行完任务后的返回结果)

 

 

class MyAsyncTask extends AsyncTask<Integer, Integer, String> 

    @Override
    protected String doInBackground(Integer... params) 
        //运行在工作线程
        //在onPreExecute方法执行完成后马上执行,负责执行
        //耗时的后台处理任务,可调用publishProgress方法实
        //时更新任务进度
    

    @Override
    protected void onPreExecute() 
        //运行在UI线程
        //在执行后台耗时操作之前,通常用于一些初始化操作,比如进度条显示
    

    @Override
    protected void onProgressUpdate(Integer... values) 
        //运行在UI线程
        //在doBackground方法中,每次调用publishProgress方法都会触发该方法
    

 

 

 

 

 

->在UI线程创建MyAsyncTask实例

->在UI线程中调用mAsyncTask.execute()

 一个完整的例子

MainActivity

 

package com.example.myfirstapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity 

    private TextView txttitle;
    private ProgressBar pgbar;
    private Button btnupdate;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txttitle = (TextView)findViewById(R.id.txttitle);
        pgbar = (ProgressBar)findViewById(R.id.pgbar);
        btnupdate = (Button)findViewById(R.id.btnupdate);
        btnupdate.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                MyAsyncTask myTask = new MyAsyncTask(txttitle,pgbar);
                myTask.execute(1000);
            
        );
    


class DelayOperator 
    //延时操作,用来模拟下载
    public void delay()
    
        try 
            Thread.sleep(1000);
        catch (InterruptedException e)
            e.printStackTrace();;
        
    


class MyAsyncTask extends AsyncTask<Integer,Integer,String>

    private TextView txt;
    private ProgressBar pgbar;

    public MyAsyncTask(TextView txt,ProgressBar pgbar)
    
        super();
        this.txt = txt;
        this.pgbar = pgbar;
    


    //该方法不运行在UI线程中,主要用于异步操作,通过调用publishProgress()方法
    //触发onProgressUpdate对UI进行操作
    @Override
    protected String doInBackground(Integer... params) 
        DelayOperator dop = new DelayOperator();
        int i = 0;
        for (i = 10;i <= 100;i+=10)
        
            dop.delay();
            publishProgress(i);
        
        //i + params[0].intValue()
        return  "";
    

    //该方法运行在UI线程中,可对UI控件进行设置
    @Override
    protected void onPreExecute() 
        txt.setText("开始执行异步线程~");
    


    //在doBackground方法中,每次调用publishProgress方法都会触发该方法
    //运行在UI线程中,可对UI控件进行操作


    @Override
    protected void onProgressUpdate(Integer... values) 
        pgbar.setProgress(values[0].intValue());
    

 

布局代码

activity_main

<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=".MyActivity">
    <TextView
        android:id="@+id/txttitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <!--设置一个进度条,并且设置为水平方向-->
    <ProgressBar
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/pgbar"
        style="?android:attr/progressBarStyleHorizontal"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnupdate"
        android:text="更新progressBar"/>
</LinearLayout>

 

以上是关于Android AsyncTask详解的主要内容,如果未能解决你的问题,请参考以下文章

从片段调用 Android AsyncTask 没有调用其成员 - doInbackground、onpreexecute、onpostexecute

如何从android中的自定义适配器调用Activity asynctask

Android UI 线程消息队列调度顺序

Android中的AsyncTask和接口回调使用详解

Android AsyncTask详解

Android 多线程-----AsyncTask详解