android面试(8)-AsyncTask

今天讲一讲AsyncTask的基本知识。

1.概念:

AsyncTask是Android提供的轻量级的异步类,本质上就是一个封装了线程池和handler的异步框架;

2.使用方法

(1)三个参数

       (A)Params:参数的类型;

       (B)Progress:后台任务执行进度的类型

       (C)Result:后台任务的返回结果的类型

(2)五个方法

       (A)onPreExcute():做一些初始化操作,在UI线程中执行

       (B)doInBackground(Params... params):在线程池中运行,此方法用于执行异步任务,params参数表示异步任务的输入参数,在此方法中可以调用publishProgress方法来更新任务进度;

       (C)onProgressUpdate(Progress... update):在主进程中执行,当后台任务执行进度发生改变时会调用此方法;

       (D)onPostExecute(Result result):在主线程中运行,异步任务完成之后,调用此方法

       (E)onPublishProgress():刷新线程;

代码实例:

新建AsyncTaskFace类继承AsyncTask

public class AsyncTaskFace extends AsyncTask,Integer,String> {

    TextView textView;
    ProgressBar progressBar;

    public AsyncTaskFace(TextView textView,ProgressBar progressBar) {
        this.textView=textView;
        this.progressBar=progressBar;
    }

    @Override
    protected String doInBackground(Integer... params) {
        int i;
        for (i=10;i<100;i+=10){
            publishProgress(i);
        }
        return i+params[0].intValue()+"";
    }


    @Override
    protected void onPreExecute() {
        textView.setText("开始执行异步任务");
    }

    @Override
    protected void onPostExecute(String s) {
        textView.setText("异步任务执行结束     " +s);
    }

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

}

在MainActivity的onCreate中调用

AsyncTaskFace asyncTaskFace=new AsyncTaskFace(textView,progressBar);
asyncTaskFace.execute(2017);

3.机制原理:

(1)本质上是一个静态线程池,AsyncTask派生出来的子类可以实现不同的异步任务,这些任务都是提交到静态线程池中执行的;

(2)线程池中的工作线程执行DoInBackground()执行异步任务

(3)当任务状态改变后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler响应这些消息,并调用相关回调函数

4.AsyncTask的注意事项:

(1)内存泄漏,原理和上一篇的handler相同,都是非静态内部类持有外部类的引用,导致外部类无法及时回收;

(2)生命周期:在Activity的onDestroy()中调用cancel()方法

(3)结果丢失:在屏幕旋转/Activity意外结束时,Activity被创建,而AsyncTask会拥有之前Activity的引用,会导致结果丢失;


你可能感兴趣的:(android,android面试题)