android:AsyncTask的介绍和使用

本文深入解析了Android中AsyncTask的使用场景与机制,包括其为何被设计出来、如何简化多线程通信,并通过实例展示了如何模拟异步下载任务时的进度条变化,对比了AsyncTask与Handler的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.AsyncTask

1-1:为什么要使用AsyncTask?

由于android开发时,不允许在主线程中进行耗时操作(网络请求,ui改变等),所以需要在子线程中进行相应的耗时操作,为了满足多线程之间的通信,提出了Handler类(异步操作的核心类)。由于Handler核心类中涉及了相对复杂的操作(涉及Handler,Message,Looper,Thread),所以自android1.5开始,引入了AsyncTask类,这是一个轻量级的框架,在内部封装了Handler,方便使用。

1-2:AsyncTask中的简单定义:

 class TestTask extends AsyncTask<Params, Progress, Result>

用一个类去继承此抽象类,同时,在继承的同时可以使用其中的三个泛型参数

1、Params:供后台使用的参数,在调用execute方法时传递的参数类型
2、progress:后台任务的执行任务的类型
3、Result:后台任务的返回参数的类型

1-3:在AsyncTask中常被复写的方法

1.onPreExecute()在异步任务开始前进行调用,用于进行界面的一些初始化操作(主线程)

2.doInBackground(params...) 在此处去实现所有的耗时操作,通过return返回参数(类型为泛型3),在该方法中不能进行ui操作,如果要进行任务进度的更新,必须调用publishProgress(tType_progess),实现进程更新的汇报(子线程)

3.onProgressUpdate(Progress) 当子线程中调用了publishProgress后,会触发该函数(如果无上述函数,该函数不会被触发),接收了上传的任务进度值,可以进行ui的更新(主线程)

4.onPostExecute 异步任务执行完毕后,该函数接收doInBackground传递而来的泛型,通过返回的时候可以进行ui更新等操作

注:1 2 4方法在AsyncTask中一定被调用,而3需要被publishProgress触发

 

使用实例:模拟异步下载任务时的进度条变化

public class MainActivity extends AppCompatActivity {
    private Button btn;
    private ProgressBar pb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.btn);
        pb = (ProgressBar) findViewById(R.id.pb);
    }

    public void startTask(View view) {
//        TestTask task=new TestTask();
//        task.execute();
        new TestTask().execute();
    }

    class TestTask extends AsyncTask<Void, Integer, Boolean> {
        //在异步线程中执行想要的耗时操作
        int progress = 0;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //当前依旧在主线程之中 可以进行相应的准备工作
            Log.d("TAG", "准备下载");
            pb.setVisibility(View.VISIBLE);
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            Log.d("TAG", "正在下载");

            try {
                while (true) {
                    Thread.sleep(1000);//模拟每隔1s下载百分之10
                    progress += 10;
                    publishProgress(progress);
                    if (progress >= 100) {

                        break;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            Log.d("TAG", "下载回调" + values[0] + "%");
            pb.setProgress(values[0]);
        }

        //回主线程
        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
            if(aBoolean==true){
                Log.d("TAG", "下载成功");
                pb.setVisibility(View.GONE);
            }else {
                Log.d("TAG", "下载失败");
                pb.setVisibility(View.GONE);
            }
        }
    }
}
注:关于AsyncTask和Handler的对比
AsyncTask和Handler同样用于异步操作 但是区别在于:
1.AsyncTask是android提供的一个轻量级的异步类,可以直接继承AsynTask,在类中实现异步操作,同时使用两个函数在主线程和子线程中相互进行沟通
优点:简单快捷,过程可控
缺点:在多个异步操作合并需要UI变更的时候,变得复杂

2.Handler 在实现异步操作的时候 涉及Handler Message Looper Thread 四个对象,过程是首先用主线程启动Thread(子线程),子线程运行并生成Message,通过Handler进行Message的装填,然后Looper去消息队列中取出Message 由主线程的Handler进行UI变更
优点:使用结构清晰明确,尤其是对于多个任务时
缺点:单个异步任务时,代码过多,结构相对过于复杂

总结:
看异步任务的多少来使用AsyncTask或者Handler

 

 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值