Android AsyncTask

YOLOv8【第二章:卷积创新篇·第23节】一文搞懂,Transformer与卷积混合架构! 🏆 本文收录于 《YOLOv8实战:从入门到深度优化》,该专栏持续复现网络上各种热门内容(全网YOLO改进最全最新的专栏,质量分97分+,全网顶流),改进内容支持(分类、检测、分割、追踪、关键点、OBB检测)。且专栏会随订阅人数上升而涨价(毕竟不断更新),当前性价比极高,有一定的参考&学习价值,部分内容会基于现有的国内外顶尖人工智能AIGC等AI大模型技术总结改进而来,嘎嘎硬核。    ✨ 特惠福利:目前活动一折秒杀价!一次订阅,永久免费,所有后续更新内容均免费阅读! 阅读详情
  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的任务执行是并行和串行根据自己选择。
  • 串行的时候,所以无法进行太耗时的操作,如图片加载库等。
完整的 Python 数据分析案例:新能源汽车续航里程预测 随着新能源汽车的普及,续航里程成为消费者关注的重要指标。准确预测新能源汽车的续航里程,有助于车企优化电池管理系统、提升车辆性能,也能帮助消费者合理规划出行。本案例将基于新能源汽车的各项参数,如电池容量、行驶速度、环境温度等,构建续航里程预测模型。通过以上改进,可以提高数据处理的准确性、模型的性能和可视化的效果。 阅读详情

相关推荐

LabVIEW+数据库应用系列保姆级教程,第一篇数据库连接

目录LabVIEW连接数据库的方法连接MySQL连接Oracle,SQL Server,Access等 LabVIEW连接数据库的方法 1、创建udl(Universal Data Link)是通用数据连接文件。界面操作,简单快捷。 2、编写连接字符串。需要熟悉连接字符串的结构,容易出错。 3、其他… 本教程教你使用第1种方法,也是最简单、最常用的方法。 连接MySQL 1、在MySQL Installer内安装MySQL Connector/ODBC,建议安装32位(X86),如下图: 2、创建ODBC

wwplh5520370的博客 1万+

安卓 Android后台线程 AsyncTask

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

y__De的博客 757

实现单芯片2400bps 音频编解码方案

终于按照朋友的需求,帮他开发了一款单芯片集音频采集编码传送并接收解码播放功能的方案,交给快递公司邮寄给远在郑州的他.整个项目从开始定型到现在一个样机送出,整整花了1个月时间,感觉挺有成就感,挺有意思,工作是辛苦的,结果却是快乐的.现在将这中快乐的的心情与大家分享一下.    真个项目用一颗主控搞定,ARM9的,200KBytes 片内RAM,主频可以跑到300MHz,64pin LQFP封装

nyxsec的专栏 3683

Android AsyncTask 深度解析

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

2501_90389522的博客 1582

STM32F103模拟SSI时序解析:实现高精度绝对式编码器位置读取

本文详细解析了如何在STM32F103微控制器上通过软件模拟SSI协议时序,实现高精度绝对式编码器的位置读取。文章从项目驱动出发,深入剖析了SSI通信原理、硬件电平转换连接、核心软件模拟代码实现及关键时序参数调试方法,并提供了使用示波器进行波形对齐与优化的实战指南,为成本敏感型工业控制与机器人项目提供了高性价比的解决方案。

weixin_29196315的博客 141

ASReview:基于主动学习的AI文献筛选工具,提升科研效率

主动学习是机器学习的一个重要分支,其核心原理是让算法能够主动选择最有价值的数据进行标注,从而以更低的成本获得更好的模型性能。这一技术通过人机协作的闭环流程,显著提升了数据标注和模型训练的效率和精度。在工程实践中,主动学习尤其适用于数据标注成本高昂或数据类别不平衡的场景,例如医学影像分析、自然语言处理中的文本分类以及推荐系统的冷启动问题。通过优先标注模型最不确定的样本,它能够有效解决传统机器学习面临的冷启动和数据稀疏性挑战。本文聚焦的ASReview项目,正是将主动学习原理应用于系统文献综述这一具体场景,通过

weixin_28725959的博客 431

安卓AsyncTask

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

博客 572

把 SAP GUI 做成可维护的应用:Module Pool 基础与 Table Control 深入实战

SAP Module Pool 与 Table Control 开发要点 摘要:Module Pool 作为 SAP GUI 交互的核心技术,由程序、屏幕(Dynpro)和流逻辑(Flow Logic)组成,通过 PBO/PAI 事件驱动数据流。Table Control 是其中处理多行数据的核心控件,其开发关键在于: 正确理解 PBO/PAI 数据流机制 掌握 CXTAB_CONTROL 结构的关键属性(LINES、TOP_LINE 等) 合理设置列控制属性(CXTAB_COLUMN) 采用 LOOP W

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

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

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

xiangzaixiansheng的博客 219

基于轻量化网络的干扰信号智能识别算法

针对干扰信号识别时卷积神经网络模型体积大、训练周期长、对硬件存储和计算要求高等问题,本 文提出了一种基于改进轻量级网络模型 SqueezeNet 的干扰信号智能识别算法。该方法首先利用距离多普勒 (Range‑Doppler,RD)处理获得目标及干扰信号的RD图像,接着采用滑窗变换、归一化等技术对RD图像进行重 塑;然后采用基于 RD 信息尺寸的隐层和通道剪枝措施对 SqueezeNet 网络进行改进,缩小了模型尺寸和存储空 间;最后利用不同参数的测试样本拓展网络模型的泛化性能。

qq_43416206的博客 545

小波变换(深入浅出)

小波变换

weixin_46713695的博客 3万+

详解Android中AsyncTask的使用

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

LiuHe 39万+

LangChain面试内容整理-知识点27:LangChain性能调优

LLM应用可能面临响应慢、成本高等性能问题。LangChain提供了一些优化方法和经验来提升性能和效率。

不务正业的猿 327

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

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

Abby同学思考的地方 383

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

android AsyncTask介绍

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

u012123938的专栏 409

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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、付费专栏及课程。

余额充值