码迷,mamicode.com
首页 > 移动开发 > 详细

Android AsyncTask详解

时间:2019-09-11 11:31:23      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:bundle   步骤   app   get   方法   val   tle   return   apk   

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详解

标签:bundle   步骤   app   get   方法   val   tle   return   apk   

原文地址:https://www.cnblogs.com/shineyoung/p/11505053.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!