Android AsyncTask

UE5在Ubuntu22.04.4下的高效开发环境配置指南 本文详细介绍了在Ubuntu 22.04.4系统上配置UE5高效开发环境的完整指南,包括系统准备、显卡驱动安装、UE5引擎编译与配置、开发工具链设置以及性能优化技巧。通过逐步指导,帮助开发者快速搭建稳定的UE5开发环境,解决常见问题,提升开发效率。 阅读详情
  1. 类的简介
  2. 示例
  3. 代码浅析
  4. 优缺点总结

AsyncTask 支持正确、方便使用UI线程。不必去操作线程或者Handler,就可以把线程任务的结果返回到UI线程中来。注意哦,这里并没有用高并发、异步等词汇。

抽象类AsyncTask

public abstract class AsyncTask<Params, Progress, Result> {
...
 	@WorkerThread
    protected abstract Result doInBackground(Params... params);
...

}

首先AsyncTask是一个抽象类,而且需要确定三个泛型

  • Params :数据源,如URL,IO流等。
  • Progress:处理的进度,如任务完成百分比等。
  • Result:任务处理完成,需要返回的结果类型。如需要返回一个List等。

类中有个抽象方法,doInBackground,运行在后台线程中。根据这个方法我们可以看到和其它方法的一些关系。

我们继承一AsyncTask

  public class MyAsyncTask extends AsyncTask<List, Integer, String> {
        /**
         * 在doInBackground之前调用。运行在UI线程中
         * 一般做些初始化操作
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        /**
         * 具体处理任务的方法,在子线程中运行
         *
         * @param list
         * @return 任务处理完的时候返回的结果
         */
        @Override
        protected String doInBackground(List... list) {
            int length = list.length;
            for (int i = 0; i < length; i++) {
                List list1 = list[i];
                list1.add("你好");
                //把当前进度转到onProgressUpdate,UI线程中
                publishProgress(list1.size());
            }

            return "完成喽";
        }

        /**
         * 调用publishProgress之后会调用此方法并。
         * 内部是利用Handler进行消息处理,实现回调,并传入参数
         * 运行在UI线程中
         *
         * @param values
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            int length = values.length;
            for (int i = 0; i < length; i++) {
                Log.i("task", "values:  " + values[i] + "   i:" + i);
            }
        }

        /**
         * 不调用cancel方法并且doInBackground执行完成会回调
         * 回调的完成也是通过handler,并传入参数
         *
         * @param s
         */
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
        }

        /**
         * 调用cancel方法并且doInBackground执行完成会回调
         * 回调的完成也是通过handler,并传入参数
         *
         * @param s
         */
        @Override
        protected void onCancelled(String s) {
            super.onCancelled(s);
        }
    }


		//Activity中执行的话
		MyAsyncTask myAsyncTask = new MyAsyncTask();
        myAsyncTask.execute(new ArrayList());

方法注释的很清楚了。运行起来看log吧,或者可以配合一些控件看看,最适合的就是读写文件的操作,看进度条。而且它里面的调用线程切换基本都是通过handler。毕竟Android里面handler就是专门干这个的。

源码浅析。
先从执行处开始,看看他的execute方法

  	@MainThread
    public final AsyncTask<Params, Progress, Result> execute(Params... params) {
    	//直接调用了一个需要Execute的参数的方法
        return executeOnExecutor(sDefaultExecutor, params);
    }
    ...
      @MainThread
    public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,
            Params... params) {
            //如果不是尚未执行状态
        if (mStatus != Status.PENDING) {
            switch (mStatus) {
                case RUNNING:
                    throw new IllegalStateException("Cannot execute task:"
                            + " the task is already running.");
                case FINISHED:
                    throw new IllegalStateException("Cannot execute task:"
                            + " the task has already been executed "
                            + "(a task can be executed only once)");
            }
        }
        //状态设置为正在执行
        mStatus = Status.RUNNING;
        //准备的方法
        onPreExecute();
        
        mWorker.mParams = params;
        exec.execute(mFuture);

        return this;
    }

之后,最终会调用传入的Execute的execute方法。
而这个Execute其实是一个内部类SerialExecutor

private static class SerialExecutor implements Executor {
		//内部一个Object数组,实现一个队列的效果
        final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
        Runnable mActive;

        public synchronized void execute(final Runnable r) {
        	//入队一个Runnable,run方法跑的是之前传进去的WorkerRunnable的参数
            mTasks.offer(new Runnable() {
                public void run() {
                    try {
                    	//先执行当前run方法
                        r.run();
                    } finally {
                    	//再取出队列中的第一个
                        scheduleNext();
                    }
                }
            });
            if (mActive == null) {
                scheduleNext();
            }
        }

        protected synchronized void scheduleNext() {
        	//取出队列的第一个Runnable
            if ((mActive = mTasks.poll()) != null) {
            	//AsyncTask内部的线程池,执行Runnable
                THREAD_POOL_EXECUTOR.execute(mActive);
            }
        }
    }

我们把数据源交给AsyncTask,然后它通过execute方法最终调用了交给了添加到Runnable中交给线程池处理,但是从代码中可以看出,必须前面一个任务执行完成后,才能执行下一个任务。

既然他是线程切换,肯定少不了handler和runnable实现。这些都在一个构造方法中,看代码:

	/**
     * Creates a new asynchronous task. This constructor must be invoked on the UI thread.
     *
     * @hide
     */
    public AsyncTask(@Nullable Looper callbackLooper) {
   		//创建一个handler,有looper就根据looper,没有就默认是UI线程。
        mHandler = callbackLooper == null || callbackLooper == Looper.getMainLooper()
            ? getMainHandler()
            : new Handler(callbackLooper);
		//创建一个WorkerRunnable,这个也是内部类
        mWorker = new WorkerRunnable<Params, Result>() {
            public Result call() throws Exception {
            	//设置任务状态
                mTaskInvoked.set(true);
                Result result = null;
                try {
                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
                    //noinspection unchecked
                    //调用doInBackground,在线程池中调用
                    result = doInBackground(mParams);
                    Binder.flushPendingCommands();
                } catch (Throwable tr) {
                	//关闭
                    mCancelled.set(true);
                    throw tr;
                } finally {
                	正常结束
                    postResult(result);
                }
                return result;
            }
        };
		//FutureTask,实现了Runnable接口
        mFuture = new FutureTask<Result>(mWorker) {
            @Override
            protected void done() {
            //任务结束之后
                try {
                    postResultIfNotInvoked(get());
                } catch (InterruptedException e) {
                    android.util.Log.w(LOG_TAG, e);
                } catch (ExecutionException e) {
                    throw new RuntimeException("An error occurred while executing doInBackground()",
                            e.getCause());
                } catch (CancellationException e) {
                    postResultIfNotInvoked(null);
                }
            }
        };
    }
//返回结果
private void postResultIfNotInvoked(Result result) {
        final boolean wasTaskInvoked = mTaskInvoked.get();
        if (!wasTaskInvoked) {
        //最终利用handler
            postResult(result);
        }
    }

//
 private Result postResult(Result result) {
        @SuppressWarnings("unchecked")
        Message message = getHandler().obtainMessage(MESSAGE_POST_RESULT,
                new AsyncTaskResult<Result>(this, result));
        message.sendToTarget();
        return result;
    }

//handler
 private static class InternalHandler extends Handler {
        public InternalHandler(Looper looper) {
            super(looper);
        }

        @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
        @Override
        public void handleMessage(Message msg) {
            AsyncTaskResult<?> result = (AsyncTaskResult<?>) msg.obj;
            switch (msg.what) {
                case MESSAGE_POST_RESULT:
                //结束
                    // There is only one result
                    result.mTask.finish(result.mData[0]);
                    break;
                case MESSAGE_POST_PROGRESS:
                //进度
                    result.mTask.onProgressUpdate(result.mData);
                    break;
            }
        }
    }

当然,我们只能调用无参构造方法,另外两个都被/**@hide*/了线程池处理任务,handler负责线程间通信。

总结

  1. 优点:
  • AsyncTask 通过线程池和handler,帮我们封装好了子线程处理任务到UI线程的返回过程。
  • 五个方法
    onPreExecute:开启任务线程前执行。运行在UI线程
    doInBackground:任务线程中执行,运行中任务线程。
    publishProgress:在doInBackground调用,把任务进度传递到UI线程。如果被关闭的话不再回调onProgressUpdate。
    onProgressUpdate:调用publishProgress,并且没有被关闭的情况下执行,运行在UI线程。
    onPostExecute:没有调用cancel方法并且doInBackground执行完成会回调,运行在UI线程。
    onCancelled:调用cancel方法并且doInBackground执行完成会回调,运行在UI线程。

publishProgress:

@WorkerThread
    protected final void publishProgress(Progress... values) {
    	//没有关闭发送MESSAGE_POST_PROGRESS
        if (!isCancelled()) {
            getHandler().obtainMessage(MESSAGE_POST_PROGRESS,
                    new AsyncTaskResult<Progress>(this, values)).sendToTarget();
        }
    }

finish:

private void finish(Result result) {
        if (isCancelled()) {
        	//关闭后的回调
            onCancelled(result);
        } else {
        	//没有关闭的回调
            onPostExecute(result);
        }
        mStatus = Status.FINISHED;
    }
  • 可能你会有疑问,AsyncTask只能调用一次execute方法,那还要线程池干嘛呢?
    其实这个只能调用一次execute,是针对AsyncTask对象的。我们可以多new一些对象。而线程池是静态的。
 public static final Executor THREAD_POOL_EXECUTOR;
 //静态代码块只执行一次。
 static {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS,
                sPoolWorkQueue, sThreadFactory);
        threadPoolExecutor.allowCoreThreadTimeOut(true);
		//静态Executor持有线程池的引用
        THREAD_POOL_EXECUTOR = threadPoolExecutor;
    }
  1. 缺点
    现在我们在doInBackground中添加如下代码
			 @Override
        protected String doInBackground(List... list) {
            StringBuffer stringBuffer = new StringBuffer();
            for (int i = 0; i < 5; i++) {
                String s = "i:  " + i + "  threadName:  " + Thread.currentThread().getName();
                stringBuffer.append(s + "\n");
                publishProgress(s);
            }

            return stringBuffer.toString();
        }

写一个5次循环,i++,打印i值和线程名字,并把字符串传递出去

  @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            int length = values.length;
            for (int i = 0; i < length; i++) {
                Log.i("task", values[i]);
            }

        }

onProgressUpdate打印接收到的内容,执行五个任务。看下结果,如图:
日志图片
不看不知道一看吓一跳,有木有。虽然创建了五个线程,但是线程是按顺序执行的,并不是并发执行的。
原因就在于AsyncTask默认的任务加入线程池的方式是串行的方式加入的,也就是内部类SerialExecutor,前面有提到

 public synchronized void execute(final Runnable r) {
        	//入队一个Runnable,run方法跑的是之前传进去的WorkerRunnable的参数
            mTasks.offer(new Runnable() {
                public void run() {
                    try {
                    	//先执行当前run方法
                        r.run();
                    } finally {
                    	//再取出队列中的第一个
                        scheduleNext();
                    }
                }
            });
            if (mActive == null) {
                scheduleNext();
            }
        }

如果要改变的话,只能修改Executor了,但是…

	/** @hide */
    public static void setDefaultExecutor(Executor exec) {
        sDefaultExecutor = exec;
    }

修改的方法又被隐藏了,外界无法调用。但是我们还有一个executeOnExecutor:

并发执行

   public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,
            Params... params) {}

该方法多接收了一个Executor对象。咱们传入一个线程池就行。这样就是并行了。

new MyAsyncTask().executeOnExecutor(THREAD_POOL_EXECUTOR, new ArrayList());
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  0  threadName:  AsyncTask #1
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  1  threadName:  AsyncTask #1
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  2  threadName:  AsyncTask #1
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  3  threadName:  AsyncTask #1
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  4  threadName:  AsyncTask #1
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  0  threadName:  AsyncTask #6
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  1  threadName:  AsyncTask #6
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  0  threadName:  AsyncTask #1
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  2  threadName:  AsyncTask #6
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  1  threadName:  AsyncTask #1
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  3  threadName:  AsyncTask #6
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  0  threadName:  AsyncTask #2
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  4  threadName:  AsyncTask #6
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  1  threadName:  AsyncTask #2
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  2  threadName:  AsyncTask #2
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  3  threadName:  AsyncTask #2
07-11 16:24:28.907 2050-2050/com.example.study I/task: i:  4  threadName:  AsyncTask #2
07-11 16:24:28.917 2050-2050/com.example.study I/task: i:  2  threadName:  AsyncTask #1
07-11 16:24:28.917 2050-2050/com.example.study I/task: i:  3  threadName:  AsyncTask #1
07-11 16:24:28.917 2050-2050/com.example.study I/task: i:  4  threadName:  AsyncTask #1
07-11 16:24:28.917 2050-2050/com.example.study I/task: i:  0  threadName:  AsyncTask #7
07-11 16:24:28.917 2050-2050/com.example.study I/task: i:  1  threadName:  AsyncTask #7
07-11 16:24:28.917 2050-2050/com.example.study I/task: i:  2  threadName:  AsyncTask #7
07-11 16:24:28.917 2050-2050/com.example.study I/task: i:  3  threadName:  AsyncTask #7
07-11 16:24:28.917 2050-2050/com.example.study I/task: i:  4  threadName:  AsyncTask #7

所以:

  • AsyncTask的任务执行是并行和串行根据自己选择。
  • 串行的时候,所以无法进行太耗时的操作,如图片加载库等。
深信服AC1000-B1200到手第一步:从开箱到激活上网的保姆级图文指南 本文提供深信服AC1000-B1200企业级行为管理设备的详细开局使用指南,涵盖从开箱验机、物理连接到网络配置、安全加固及设备激活的全流程。通过图文并茂的步骤解析,帮助用户快速完成设备初始化并实现安全上网,特别适合初次接触该设备的网络管理员参考。 阅读详情

相关推荐

角谱迭代与傅里叶变换迭代算法(GS)的原理及其实例演示分析

角谱迭代与傅里叶变换迭代算法(GS)的原理及其实例演示分析 目前,迭代法和强度传输方程(TIE)法是两类典型的非干涉相位检索技术(Phase Retrieval,被称为相位恢复、相位检索、相位反演法、相位复原等)。迭代法中的经典算法是Gerchberg-Saxton(GS),随后,出现了包括错误减少算法(ER)、混合输入输出法(HIO)、梯度搜索算法、角谱迭代算法等改进算法。...

简单光学 2万+

安卓 Android后台线程 AsyncTask

1. 异步任务类AsyncTask是一个包含三个参数的泛型AsyncTask<Params,Progress,Result>,其执行异步任务方法excute(Params…)的参数为类的第一参数类型的可变参数。 2. 定义类AsyncTask的实例时,需要重写其抽象方法doInBackground()和另一个受保护的方法onPostExecute()。 3. 与Handler相比,AsyncTask增加了进度处理。 实现AsyncTask机制很简单,就是后台创建一个线程,在主线程中运行这个

y__De的博客 757

从ORCAP-1589警告看Cadence ORCAD的DRC设置:如何避免‘网络别名’引发的潜在短路风险

本文深入解析Cadence ORCAD中ORCAP-1589警告的深层含义,探讨网络别名可能引发的短路风险及DRC设置优化方案。通过分析网络别名的设计意图、DRC规则配置及最佳实践,帮助工程师有效规避设计风险,提升电路设计的可靠性和规范性。

weixin_34194829的博客 297

Android AsyncTask 深度解析

params)返回的结果,参数类型由AsyncTask类上的第三个泛型限定;onPreExecute()和onPostExecute()方法都执行在主线程,onProgressUpdate()能够更改UI(更改进度条进度)必然也是主线程。这个小demo通过求1-10的和,在doInBackground()方法中通过延时的方式模拟了耗时操作,简单的演示了AsyncTask的使用。doInBackground()方法执行在线程池某一线程中,(看过源码后得到的结果,通过Log可以知道该方法没有执行在主线程中)

2501_90389522的博客 1582

python使用TensorRT报错,多线程或多进程中使用问题

python使用TensorRT报错,Cuda Runtime问题

qq_44224801的博客 747

3DGS实战笔记:从相机坐标系到屏幕像素,手把手推导高斯椭球的投影变换矩阵

本文详细解析了3D高斯散射(3DGS)技术中从相机坐标系到屏幕像素的几何变换过程,重点推导了高斯椭球的投影变换矩阵。通过视图变换、投影变换和视口变换的完整流程,结合雅可比矩阵处理协方差矩阵,实现了高效的三维重建与渲染。文章提供了Python代码示例,帮助开发者深入理解3DGS的核心几何变换机制。

weixin_28691741的博客 438

安卓AsyncTask

参考:https://www.jianshu.com/p/ee1342fcf5e7 AsyncTask挺好用,能解决一大堆问题。 下面是总结的使用步骤: 1自定义类继承AsyncTask,里面分别传入三个参数,传入的参数、进度类型、返回的结果类型 2重写继承的相关方法,在相关方法中执行耗时操作和更新ui处理结果的操作 下面是转载的: 前言 多线程的应用在...

博客 572

Python学习24:中国古代数学问题——物不知数(Python123)

意思是说有一些物品,不知道有多少个,3个3个数的话,还多出2个;5个5个数则多出3个;7个7个数也会多出2个。题目为‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?现假设物品总数不超过n (n

weixin_60530224的博客 2万+

【安卓学习积累】AsyncTask的源码分析

在记录本文之前有参考下面大神的文章,本文也加入了一些自己的见解。旨在记录和学习一些Android知识。欢迎大家一起来讨论。 别再傻傻得认为AsyncTask只可以在主线程中创建实例和调用execute方法 一、抛出几个问题 1.AsyncTask是否只能在主线程中创建并执行呢? 2.AsyncTask中的onPreExecute()、doInBackground(String... par...

xiangzaixiansheng的博客 219

软考中级信息系统监理师(第二版)-第21章基础设施工程监理

由于网络信息技术的飞速发展,变化日新月异,网络设计不但要保证目前网络传输容量的要求,也要考虑今后网络的发展,满足当前以及今后相当一段时间内的网络需求,便于向新技术的升级和衔接,同时又需要保护原有的投资。通用布缆系统工程中,承建单位的竣工文档主要包括以下内容:承建合同,招标文件,投标文件,设计方案,工程实施组织设计方案,工程施工报告,隐蔽工程记录,变更记录,自测报告,信息点分布图(表),园区、楼宇、水平配线表,楼层平面图及无线设备点位图,无线设备信息表,竣工图纸等。多排安装时,列间距不应小于1200mm。

2301_78583973的博客 1400

直方图均衡化原理及matlab和opencv实现代码

详细分析了直方图均衡化的数学原理,配有matlab和opencv实现代码

qq_21603315的博客 4777

详解Android中AsyncTask的使用

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下。

LiuHe 39万+

让 ABAP 再次优雅:全面认知 ABAP Development Tools for SAP HANA(ADT)与可运行示例

本文介绍了ABAP开发工具ADT(ABAP Development Tools for SAP HANA)的核心概念与价值。ADT是基于Eclipse的现代化ABAP集成开发环境,支持ABAP Platform、S/4HANA等后端开发,提供代码编辑、CDS数据建模、质量检查等全流程功能,相比传统SAP GUI具有显著优势。文章详细阐述了ADT与SAP HANA的关系、关键能力模块(如代码重构、CDS建模、质量管控等),并通过一个制造企业案例说明其实际应用场景。最后提供了ADT安装指南和一个完整的ABAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 669

Getting NoClassDefFoundError: android.os.AsyncTask

This problem has been bothering me for a bit and I cannot find a satisfactory solution. Many times (not always) in the creation of a specific object on the Android emulator I get NoClassDefFoundErr

攻城狮Luke 1895

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

安卓—— 详解Android中AsyncTask的使用

原文链接:http://blog.youkuaiyun.com/liuhe688/article/details/6532519 在Android中实现异步任务机制有两种方式,Handler和AsyncTask。 Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例

Abby同学思考的地方 383

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android AsyncTask介绍

AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点: l 简单,快捷 l 过程可控 使用的缺点: ...

u012123938的专栏 409

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android AsyncTask 详解

将复杂工作异步化、线程化对于Android 的性能的提高起到了很重要的作用,Android 框架为开发提供了很多辅助程序,这一篇着重分析Android AsyncTask的原理。

私房菜 6810

android之AsyncTask

android之AsyncTask

qq_44910624的博客 291

android.os.AsyncTask注意问题

android.os.AsyncTask在使用的时候,有几点需要格外注意: 1.异步任务的实例必须在UI线程中创建。 2.execute(Params... params)方法必须在UI线程中调用。 3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values

liu_jia_guo的专栏 810

安卓的异步任务AsyncTask

第二个泛型用来限制onProgressUpdate(Progress)和publishProgress(Progress)方法传入参数的类型,在publishProgress方法中传入的参数会在onProgressUpdate回调方法中被使用。第一个泛型用来限制execute(Params)和doInBackground(Params)方法传入参数的类型,在execute方法中传入的参数会在doInBackground回调方法中被使用。广泛地讲异步任务就是以多线程的方式完成的功能需求,相对于同步。

weixin_71792169的博客 736

安卓-AsyncTask的用法

原帖【悟道】: 跳转       在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则: 1. 不要阻塞UI线程 2. 确保只在UI线程中访问Android UI工具包       当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thre

ruiruiddd的博客 920

Android AsyncTask源码解析

最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!这里附上我整理的几十套腾讯、字节跳动,京东,小米,头条、阿里、美团等公司19年的Android面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。由于篇幅有限,这里以图片的形式给大家展示一小部分。

2401_86353930的博客 2229

Android AsyncTask 源码解析

一个接着一个的执行,相当于单线程。22行:将我们传入的参数赋值给了mWorker.mParams ,mWorker为一个Callable的子类,且在内部的call()方法中,调用了doInBackground(mParams),然后得到的返回值作为postResult的参数进行执行;看到这里,大家可能会认为,背后原来有一个线程池,且最大支持128的线程并发,加上长度为10的阻塞队列,可能会觉得就是在快速调用138个以内的AsyncTask子类的execute方法不会出现问题,而大于138则会抛出异常。

2401_89790938的博客 991

Android API之android.os.AsyncTask

android.os.AsyncTask&lt;Params, Progress, Result&gt; AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thre...

weixin_34203832的博客 187

Android AsyncTask解析

AsyncTask是安卓为简化子线程访问ui操作提供的一个线程类工具类,但是AsncTask在Android系统的不断升级中,经过了多次修改,导致不同的API版本上使用AsyncTask具有不同的表现,接下来主要分析AsyncTask的使用与注意事项。 AsyncTask是一个轻量级的一部任务类,它可以在子线程执行任务,然后把执行结果分发到主线程进行处理,原理上来讲,AsyncTask是对线程池...

静虚待令,有物混成 395

android.os.AsyncTask的应用

简介 AsyncTask可以使得使用UI线程变的更容易更适当,它可以在后台运行一些操作然后在UI上展现,不用操作具体的线程和handlers 一个 asynchronous task包括三种基本类型(调用参数,进度和结果),和四个步骤(调用开始,在后台运行,处理进度,结束) ), and most often will override a second one (onPostExecute

DUKE0317的专栏 665
上一篇: Android ContentProvider
下一篇: Android HeadlerThread
彼天
博客等级 码龄11年 37粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值