Android异步消息处理机制之AsyncTask

Android的AsyncTask提供了一种简洁的异步消息处理方式。通过创建AsyncTask子类并重写相关方法,如doInBackground()进行后台任务执行,onPostExecute()更新UI。泛型参数包括Params、Progress和Result,分别对应任务参数、进度和结果。在onPreExecute中进行UI初始化,doInBackground执行任务,需要更新界面进度时调用publishProgress,然后在onProgressUpdate处理,最后onPostExecute接收并处理任务结果。
摘要由CSDN通过智能技术生成

前言

相较于Handler,AsyncTask更简单一点,它是一个抽象类,要实现异步消息,就的自己创建一个类继承AsyncTask,重写要使用的方法,将要在子线程中执行的程序,放在doInBackground方法中,要在更新界面时,子线程中返回的结果在onPostExecute()方法中,怎么显示就任由开发者了,当然还会有其它几个方法,下面会一一解释。

AsyncTask的泛型参数

在新建一个AsyncTask时,需要指定三个泛型参数:Params、Progress、Result。

  • Params是指执行任务时所需要的参数;
  • Progress是指执行任务时的进度;
  • Result是任务执行完毕之后,返回的参数。

AsyncTask的几个方法

要执行任务时,我们只需在合时宜的方法中,执行自己想要执行的程序即可。它们分别是:

  • onPreExecute 该方法在任务执行前调用,可以在该方法中做一些UI界面的初始化操作,比如来个弹窗之类的。
  • doInBackground 在该方法中就执行自己的耗时任务,它是运行在子线程中,当任务运行完毕之后,即可将结果return,AsyncTask会自己将该结果传递到onPostExecute()中,当然如果想实时显示任务进度,则可以在该方法中调用publishProgress()方法,调用该方法之后,AsyncTask会将它穿的参数传递到onProgressUpdate()中。
  • onProgressUpdate方法主要是更新任务进度的,它是执行在UI线程中,可以修改界面。
  • onPostExecute()方法是用来处理任务结果的,它的参数即任务结束之后return过来的参数,该方法是执行在UI线程中,可以修改界面。

第一行代码Demo参考

package com.example.myasynctask;

import android.app.ProgressDialog;
import android.graphics.Bitmap;
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.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private ProgressDialog mDialog;

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

    private void initView() {
        Button mBtnDownload = findViewById(R.id.btn_download);
        mBtnDownload.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        new DownloadAsyncTask().execute("开始");
    }

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


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            initDialog();
        }

        @Override
        protected String doInBackground(String... strings) {
            int i = 0;
            while (true){
                i++;
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                publishProgress(i);
                if(i>=100){
                    break;
                }
            }
            return "下载完成";
        }

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

        @Override
        protected void onPostExecute(String bitmap) {
            super.onPostExecute(bitmap);
            Toast.makeText(MainActivity.this,bitmap,Toast.LENGTH_SHORT).show();
            mDialog.dismiss();
        }
    }

    private void initDialog() {
        mDialog = new ProgressDialog(this);
        mDialog.setMax(100);
        mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mDialog.setTitle("下载进度");
        mDialog.show();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值