Handler 相关知识,面试必问

扒一扒面试必问的Handler 前言 Handler作为Android代码编写以及面试时经常遇到的内容,有必要花个时间整理一下,毕竟写过的东西印象会更加深刻。 1.什么是Handler? 1.1 定义 源码里面捞出来的内容,英文不难看懂。主要就是说每个Handler会和每个线程以及线程对应的消息队列相绑定。之后消息就可通过Handler在线程之间传递。 A Handler allows you to send and process {@link Message} and Runnable objects associated 阅读详情

做Android开发肯定离不开跟Handler打交道,它通常被我们用来做主线程与子线程之间的通信工具,而Handler作为Android中消息机制的重要一员也确实给我们的开发带来了极大的便利。可以说只要有异步线程与主线程通信的地方就一定会有Handler。在面试中Handler也是经常被问的一个点,那么本篇文章就以问答的方式,带你了解一下关于Handler的重要知识点。

1.一个线程有几个Looper?几个Handler?

一个Thread只能有一个Looper,一个MessageQueen,可以有多个Handler

以一个线程为基准,他们的数量级关系是:Thread(1):Looper(1):

MessageQueue(1):Handler(N)

2.Handler内存泄漏原因?以及最佳解决方案?

泄露原因:

Handler允许我们发送延时消息,如果在延时期间用户关闭了Activity,那么该Activity会泄露。这个泄露是因为Message会持有Handler,而又因为Java的特性,内部类会持有外部类,使得Activity会被Handler持有,这样最终就导致Activity泄露。

解决方案

1.最直接的思路就是避免使用非静态内部类。使用Handler的时候,放在一个新建的文件中来继承Handler或者使用静态的内部类来替代。静态内部类不会隐含的持有外部类的引用,因此这个activity也就不会出现内存泄漏问题。

2.如果你需要在Handler内部调用外部Activity的方法,你可以让这个Handler持有这个Activity的弱引用,这样便不会出现内存泄漏的问题了。

3.另外,对于匿名类Runnable,我们同样可以设置成静态的,因为静态内部类不会持有外部类的引用。

4.注意:如果使用Handler发送循环消息,最好是在Activity的OnDestroy方法中调用mLeakHandler.removeCallbacksAndMessages(null);移除消息。(这不是解决内存泄漏的方法)

5.两种解决办法如下:

弱引用(WeakReference)

publicclassSampleActivityextendsActivity{

/**

*Instancesofstaticinnerclassesdonotholdanimplicit

*referencetotheirouterclass.

*弱引用的方式

*/

privatestaticclassMyHandlerextendsHandler{

privatefinalWeakReference<SampleActivity>mActivity;

publicMyHandler(SampleActivityactivity){

mActivity=newWeakReference<SampleActivity>(activity);

}

@Override

SampleActivityactivity=mActivity.get();

if(activity!=null){

//toSomething

}

}

}

静态

//定义成static的,因为静态内部类不会持有外部类的引用privatefinalMyHandlermHandler=newMyHandler(this);

privatestaticfinalRunnablesRunnable=newRunnable(){

@Override

publicvoidrun(){//tosomething}

};

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

mHandler.postDelayed(sRunnable,1000*60*10);

finish();

}}

3.为何主线程可以newHandler?如果想要在子线程中newHandler要做些什么准备?

每一个handler必须要对应一个looper,主线程会自动创建Looper对象,不需要我们手动创建,所以主线程可以直接创建handler。在newhandler的时候没有传入指定的looper就会默认绑定当前创建handler的线程的looper,如果没有looper就报错。因为在主线程中,Activity内部包含一个Looper对象,它会自动管理Looper,处理子线程中发送过来的消息。而对于子线程而言,没有任何对象帮助我们维护Looper对象,所以需要我们自己手动维护。

所以要在子线程开启Handler要先创建Looper,并开启Looper循环

如果在子线程中创建了一个Handler,那么就必须做三个操作:

1.prepare();

2.loop();

3.quit();

4.子线程中维护的Looper,消息队列无消息的时候的处理方案是什么?有什么用?

在Handler机制里面有一个Looper,在Looper机制里面有一个函数,叫做quitSafely()和quit()函数,这两个函数是调用的MessageQueue的quit()。

/**

*Quitsthelooper.

<p>

*Causesthe{@link#loop}methodtoterminatewithoutprocessingany

*moremessagesinthemessagequeue.

*</p><p>

*Anyattempttopostmessagestothequeueafterthelooperisaskedtoquitwillfail.

*Forexample,the{@linkHandler#sendMessage(Message)}methodwillreturnfalse.

*</p><pclass="note">*Usingthismethodmaybeunsafebecausesomemessagesmaynotbedelivered

*beforethelooperterminates.Considerusing{@link#quitSafely}insteadtoensure

*thatallpendingworkiscompletedinanorderlymanner.

*</p>*

*@see#quitSafely

*/publicvoidquit(){mQueue.quit(false);}/

***Quitstheloopersafely.

*<p>

*Causesthe{@link#loop}methodtoterminateassoonasallremainingmessages

*inthemessagequeuethatarealreadyduetobedeliveredhavebeenhandled.

*Howeverpendingdelayedmessageswithduetimesinthefuturewillnotbe

*deliveredbeforetheloopterminates.

*</p><p>

*Anyattempttopostmessagestothequeueafterthelooperisaskedtoquitwillfail.

*Forexample,the{@linkHandler#sendMessage(Message)}methodwillreturnfalse.

*</p>

*/publicvoidquitSafely(){mQueue.quit(true);}

再进入到MessageQueue的quit()函数。

voidquit(booleansafe){

if(!mQuitAllowed){

thrownewIllegalStateException("Mainthreadnotallowed to

quit.");

}synchronized(this){

if(mQuitting){

return;

}

mQuitting=true;

if(safe){

removeAllFutureMessagesLocked();

}else{

removeAllMessagesLocked();

}

//WecanassumemPtr!=0becausemQuittingwaspreviously

false.

nativeWake(mPtr);

}

}

它会remove消息,把消息队列中的全部消息给干掉。把消息全部干掉,也就释放了内存。

privatevoidremoveAllFutureMessagesLocked(){

finallongnow=SystemClock.uptimeMillis();

Messagep=mMessages;

if(p!=null){

if(p.when>now){

removeAllMessagesLocked();

}else{

Messagen;

for(;;){

n=p.next;

if(n==null){

return;

}

if(n.when>now){

break;

}

p=n;

}

p.next=null;

do{

p=n;

n=p.next;

p.recycleUnchecked();

}while(n!=null);

}

}

}

而在quit()函数的最后一行,有一个nativeWake()函数。

//WecanassumemPtr!=0becausemQuittingwaspreviouslyfalse.

nativeWake(mPtr);

这个函数的调用,就会叫醒等待的地方,醒来之后,就接着往下执行。

//native的方法,在没有消息的时候回阻塞管道读取端,只有

nativePollOnce返回之后才能往下执行

//阻塞操作,等待nextPollTimeoutMillis时长

nativePollOnce(ptr,nextPollTimeoutMillis);

往下执行后,发现Messagemsg=mMessages;是空的,然后就执行了这个,就接着往下走。if(msg!=null){

......

}else{

//No more messages.

//没有消息,nextPollTimeoutMillis复位

nextPollTimeoutMillis=-1;

}

然后又调用了这个方法,并且return了null。

//Processthequitmessagenowthatallpendingmessageshavebeenhandled.

//如果消息队列正在处于退出状态返回null,调用dispose();

释放该消息队列

if(mQuitting){

dispose();

returnnull;}

所以说,这个时候Looper就结束了(跳出了死循环),则达成了第二个作用:释放线程。

4.既然可以存在多个Handler往MessageQueue中添加数据(发消息时各个Handler可能处于不同线程),那它内部是如何确保线程安全的?

这里主要关注MessageQueue的消息存取即可,看源码内部的话,在往消息队列里面存储消息时,会拿当前的MessageQueue对象作为锁对象,这样通过加锁就可以确保操作的原子性和可见性了。消息的读取也是同理,也会拿当前的MessageQueue对象作为锁对象,来保证多线程读写的一个安全性。

5.我们使用Message时应该如何创建它?

创建的它的方式有两种:

一种是直接new一个Message对象,另一种是通过调用Message.obtain()的方式去复用一个已经被回收的Message,当然日常使用者是推荐使用后者来拿到一个Message,因为不断的去创建新对象的话,可能会导致垃圾回收区域中新生代被占满,从而触发GC。

Message中的sPool就是用来存放被回收的Message,当我们调用obtain后,会先查看是否有可复用的对象,如果真的没有才会去创建一个新的Message对象。

补充:主要的Message回收时机是:

1.在MQ中removeMessage后;

2.单次loop结束后;

3.我们主动调用Message的recycle方法后

6.Looper死循环为什么不会导致应用卡死?

Launch桌面的图标第一次启动Activity时,会最终走到ActivityThread的main方法,在main方法里面创建Looper和MessageQueue处理主线程的消息,然后Looper.loop()方法进入死循环,我们的Activity的生命周期都是通过Handler机制处理的,包括onCreate、onResume等方法,下面是loop方法循环。主线程的主要方法就是消息循环,一旦退出消息循环,那么你的应用也就退出了,Looer.loop()方法可能会引起主线程的阻塞,但只要它的消息循环没有被阻塞,能一直处理事件就不会产生ANR异常。

造成ANR的不是主线程阻塞,而是主线程的Looper消息处理过程发生了任务阻塞,无法响应手势操作,不能及时刷新UI。

阻塞与程序无响应没有必然关系,虽然主线程在没有消息可处理的时候是阻塞的,但是只要保证有消息的时候能够立刻处理,程序是不会无响应的。

总结:应用卡死压根与这个Looper没有关系,应用在没有消息需要处理的时候,它是在睡眠,释放线程;卡死是ANR,而Looper是睡眠。

2022 | Android大厂面试必问之FrameWork——Binder、Handler、WMS、AMS核心原理解析 通常作为一个Android APP开发者,我们并不关心Android的源代码实现,不过随着Android开发者越来越多,企业在筛选Android程序员时越来越看中一个程序员对于Android底层的理解和思考,这里的底层主要就是Android Framewok中各个组件的运行原理。 这里分享一份**《Android Framework 开发揭秘》**,深入Android底层原理的探索。内容包括:系统启动流程分析、Binder 解析、Handler解析、AMS 解析、WMS解析、PKMS Android10.. 阅读详情

相关推荐

Handler相关面试题

常见面试题: Handler相关 一.谈一谈你对handler的认识,例如:机制和实现等。 handler机制图解: handler常见使用过程: ①.子线程向主线程发送消息: 在主线程中新建Handler实例,并重写handleMessage()方法用于处理子线程传过来的message; 通过Message.obtain()方法获取到消息msg,然后将需要传递给主线程的信息通过msg的what、obj等字段传递; 通过handler的sendMessage发送msg消息,然后在hand

龚礼鹏的博客 3171

Handler 知识总结

1.一个线程有几个Handler? 一个线程可以有多个handler 2.一个线程有几个looper?如何保证 一个线程只有一个looper,是通过ThreadLocal 来保证的,每个线程都有ThreadLocal.ThreadLocalMap 变量

m0_59162559的博客 722

Modelsim安装教程以及管理员身份运行patch_dll.bat时找不到文件mgls.dll的解决

Modesim安装教程 Modesim版本有很多,但是安装方式大都相同,我们以modesim.10.5为例,电脑使用的是win10 64位,讲一下安装过程中的步骤以及出现问题的解决方法 一 安装 1.首先解压安装包,在解压的安装包内选择应用程序,右键选择管理员运行。 2.稍等一会,有的电脑会弹出是否允许modesim进行更改,选择 是 即可,然后出现下面的界面,点击下一步。 3.弹出此界面选择安装路径,选择安装路径,我是在D盘新建的文件夹,直接把文件夹中的路径复制在框内。文件夹名称切记不要带中文 4.

weixin_48564372的博客 1万+

Handler,Looper,MessageQueue

结论:一个线程可以有多个Handler,只有一个Looper,只有一个MessageQueue。多个Handler共用一个Looper和一个MessageQueue。一个应用中可以有多个Handler,多个Looper,多个MessageQueue。 一个线程可以有多个Handler 这个很好理解,你在Activity中,new 多少个Handler都不会出问题,而且每个Handler都有sen...

songshizhuyuan的专栏 801

Kali Linux下Havoc框架编译避坑指南:从环境配置到成功运行的全流程

本文提供了在Kali Linux系统上成功编译和运行Havoc开源框架的详细指南。文章重点解析了从Go语言环境配置、系统依赖库安装到交叉编译环境搭建的全流程,并针对编译过程中常见的Qt、Boost及mingw-w64等依赖问题给出了具体的解决方案,帮助安全研究人员绕过常见陷阱,顺利完成环境部署。

weixin_29230865的博客 96

NVIDIA B300 vs B200:详细解析与性能对决

详细解析 NVIDIA B300 整机)的性能,并与前代的 B200 进行对比。它不仅在核心计算能力(FP8)上实现了飞跃,更重要的是通过革命性的第二代 Transformer Engine 和第五代 NVLink 技术,彻底重塑了大规模 AI 模型训练和推理的效率与规模上限。其显存容量和带宽的巨大提升也为处理超大型模型和数据提供了坚实基础。与 B200 相比,B300 是一次全面的、代际性的性能跃升,特别适合那些需要处理最前沿、最复杂 AI 和科学计算任务的用户和组织。

2401_89353317的博客 3074

一个线程可以有几个Handler,几个Looper,几个MessageQueue对象?

在Looper的prepare方法中创建了Looper对象,并放入到ThreadLocal中,并通过ThreadLocal来获取looper的对象, ThreadLocal的内部维护了一个ThreadLocalMap类, ThreadLocalMap是以当前thread做为key的, 因此可以得知,一个线程最多只能有一个Looper对象。一个线程可以有多个Handler,但是只有一个Looper对象,只有一个MessageQueue对象。

JiYaRuo的博客 662

GNSS接收机性能测试全攻略:从实验室到真实场景

本文系统介绍了GNSS接收机从实验室到真实场景的完整性能测试流程。首先通过GNSS模拟器进行射频传导测试,评估接收机的基础性能;其次进行天线OTA测试,考察整机系统表现;最后通过精心设计的外场路测,在复杂环境中验证其实际定位精度与可靠性。文章强调,只有结合可控的实验室验证与多变的外场挑战,才能对接收机性能做出全面、真实的评价。

weixin_28365523的博客 519

Handler面试那些事

问题1:一个线程中有几个Handler? 答:多个,一个Activity或service就是在主线程中,在主线程中可以new多个Handler。 问题2:一个线程有几个Looper?如何保证? 答:一个线程只有一个Looper,通过ThreadLocal进行维持。 ThreadLocal: <key, value>,ThreadLocal是一个键值对的形式,但是key和value存放在一个数组中,如下格式。 key1 value1 key2 value2 … Key–>threadLoca

xuyin1204的博客 1050

芒果YOLOv12改进90:检测头篇之ShareSepHead:即插即用|原创新颖共享Sep检测头,更省参数量,更高效,打造新型YOLOv8检测器,精度高效涨点

芒果YOLOv12改进90:检测头篇之ShareSepHead:即插即用|原创新颖共享Sep检测头,更省参数量,更高效,打造新型YOLOv8检测器,精度高效涨点

包括YOLOv5、YOLOv7、YOLOv8等模型改进 346

广州吉欧电子科技有限公司安卓开发工程师岗位 - 技术核心、职责详解与面试指南

广州吉欧电子科技有限公司招聘安卓开发工程师,该岗位可接收优秀应届生。岗位职责包括:1)负责安卓应用架构设计与开发,确保稳定性和可扩展性;2)功能模块编码实现与测试;3)性能优化与用户体验提升;4)后端接口对接;5)系统版本适配;6)用户反馈处理迭代;7)特殊要求熟悉RTK高精度定位技术原理及使用。该岗位要求扎实的安卓开发技术、良好的架构设计能力、性能优化经验,以及特定领域的RTK专业知识,是一个技术全面且具有专业特色的开发岗位。

郑伟强dev的专栏 154

Android面试知识

文章目录assets和res/raw的区别Serializable 和 Parcelable 的区别 assets和res/raw的区别 assets中的文件资源不会映射到R中,而res中的文件都会映射到R中,所以raw文件夹下的资源都有对应的ID; assets可以能有更深的目录结构,而res/raw里面只能有一层目录; 资源存取方式不同,assets中利用AssetsManager,而res/raw直接利用getResource(), openRawResource(R.raw.fileName)

riqthen的博客 2244

MIKE水动力笔记7_实测数据与模型输出结果的拟合对比

上一博文【MIKE水动力笔记6】主要讲解如何自己制作实测数据的时间序列文件dfs0,而本博文讲解如何进行实测数据与模型输出结果的拟合对比。

晏长街的博客 1万+

腾讯T4大佬手打154页PDF,详细告诉你Handler和Binder的底层原理!教你吊打面试官!

前言 很多搞Android开发的心里都有这样的问题:Handler和Binder这两个知识点,面试时还要问吗?还有研究的必要吗?工作中似乎用不到啊。 这些问题其实并不难回答:哪个公司不是面试造火箭,工作拧螺丝? 想必大家都感受到了,越来越多的人开始涌进Android这个行业,现在的Android程序员越来越难找工作了。毕竟大环境摆在那里的,现在Android从业者真的太多了,既然有那么多可供选择的人,为什么不选择更好的呢? 于是,如大家所见的,现在的公司对Android开发者的要求越来越高了!尤其是阿里、头

m0_46962786的博客 406

Sigrity Power Tree如何进行直流压降仿真分析操作指导

Sigrity Power Tree模式可以用于前仿真,在没有layout文件的情况下对电源进行直流压降仿真分析,用于评估原理图设计以及器件选型是否合理。Model:设置为Equal Current,设置为等电源模型,意思该负载每个电源pin都是等电流的。Current:设置每个负载的电流,U30为3A,U3-U6各为1A。Nominal Current:设置能够承载的最大电流,设置为10A。Upper/ Lower Tol:设置为压降范围为5%Output Current:设置输出电流为10A。

weixin_54787054的博客 733

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

字节跳动+京东+360+网易面试题整理,Android岗

前言 之前我有个学弟,应届毕业生,秋招拿了一些 offer,这几天非常纠结。 offer 要考虑的因素太多了,盲目地搜索了几天,网上各种各样的声音都有,收获不多。为此咨询我一下,面对这种情况应该如何选择,我相信这个情况不仅仅是我学弟一人有,所以写了这篇文章,是我选择简历是一些新的,希望能帮到大家(一个案例哦!) 一线企业的app都是多线程和多进程的,而Android进程间通信机制就是Binder,原生的线程间通信则是Handler,Binder和Handler是了解安卓运行机制必须要掌握的一个知识点,更是

m0_57501529的博客 112

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

看完不会的来打我!想给金三银四找工作的程序员几点建议,社招面试心得

前言 今年是转折的一年,很多学android开发的小伙伴失业了,虽找到了一份工作,但高不成低不就,下半年金九银十有想法更换一份工作,很多需要大厂面试经验和大厂面试真题的小伙伴,想提前准备刷下题。接下来分享一份我的字节跳动、阿里巴巴、百度、小米等大厂面试经验和总结。(文末附真题解析大全) 一线企业的app都是多线程和多进程的,而Android进程间通信机制就是Binder,原生的线程间通信则是Handler,Binder和Handler是了解安卓运行机制必须要掌握的一个知识点,更是一线企业面试必问的知识点!

chayel123的博客 160

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深度学习工具包 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")

面试中Handler这些必备知识点你都知道吗?面试真题解析

前言 前几天去参加了一场面试。面试的题目大多很基础,有一道关于埋点的问题,面试官问我如果不用第三方SDK进行埋点,自己埋点的话,如何减少埋点对业务代码的入侵。 当时没想太多,就说创建一个 BaseView 类,在这个类中进行埋点的操作,然后使需要进行埋点操作的 View 继承这个 Base 类。后来想想,这个方案其实存在很多问题,因为让每个需要埋点的 View 去继承 BaseView 类,说明 View 需要自定义,会耗费很多的时间和精力,对于自带的 Button 等控件的埋点,这种方法又无法实现。所以说

m0_57081562的博客 132

Handler面试必问八大题,碰到你就赚了

Handler一直是面试过程中的常客,我们今天来看看围绕Handler究竟能玩出那些花儿来。Handler机制几乎是Android面试时必问的问题,虽然看过很多次handler源码,但是有些面试官问的问题却不一定能够回答出来,趁着机会下面总结一下面试中所覆盖的Handler知识点。如何更好地学习Handler呢?只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是浮于表象,这对我们的知识体系的建立和完备以及实战技术的提升都是不利的。

Gaga246的博客 1892

源码解析 Handler 面试宝典

在Android 的中,高级面试中,我们经常会被问到Handler 相关的知识点,而且占重比例还比较大,这是什么呢?下面一起来看一张图:由上图我们可以看出,整个APP 的启动流程: ActivityThread.main() 就是我们APP 独有的main 启动方法,如图所示,绿色的部分,就是Handler 为我们开辟的独有空间,启动主线程独有的,将当前App 独立出来。由此我们可以得出一个结论:Handler 并不是只属于进程通讯,进程通讯只是Handler 的附属功能,而Handler 的真正功能是

半身风雪 4405

Android 中 Handler 相关的面试问题分析

文章目录简要Handler 问题相关Handler 中的方法 sendMessage 和 post 的区别?答案Handler 是如何发送一个延时消息的?答案 简要 关于Android 系统中Handler,Message,MessageQueue,Looper 组成的消息机制,由于它们是开发 Android 应用程序的基础,所以在面试过程中,一定会做考察。而且每个问题必追究其原理,本篇文章将剖析曾遇到问题。 如果还不知道Handler,Message,MessageQueue,Looper 组成的消息机制

wangjiang 1181

Handler面试必问八大题:如何深挖原理进大厂?1万+字带你详细剖析!

Handler一直是面试过程中的常客,我们今天来看看围绕Handler究竟能玩出那些花儿来。 Handler机制几乎是Android面试时必问的问题,虽然看过很多次handler源码,但是有些面试官问的问题却不一定能够回答出来,趁着机会下面总结一下面试中所覆盖的Handler知识点。 题目层次 1.简述Handler的实现原理 2.一个线程有几个Handler?一个线程有几个Looper?如何保证? 3.Handler线程是如何切换的? 4.Handler内存泄漏的原因是什么?如何解决? 5.主线..

嘴巴吃糖了 891

Android面试必知必会,详细告诉你Handler和Binder的底层原理,教你吊打面试官

众所周知,程序代码是死的,系统运转是活的,各模块代码运行在不同的进程(线程)中,想要真正理解安卓的这几大服务,势必要掌握安卓的通信机制,而安卓最主要的两个通信机制就是Handler和Binder。Binder机制在Android中的地位举足轻重,我们需要掌握的很多原理都和Binder有关:系统中的各个进程是如何通信的?Android系统启动过程AMS、PMS的原理四大组件的原理,比如Activity是如何启动的?插件化原理系统服务的Client端和Server端是如何通信的?

2401_89828592的博客 1000

Gradle源码全解析,,阿里、腾讯大厂Android面试必问知识点系统梳理

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。

2301_79655576的博客 893

面试必问的一个知识点,关于HandlerThread的使用场景以及怎样使用-HandlerThread?

有些同学老问我,快要校招了 今年的金三银四退成了金四银五了,我改准备哪些知识点去面试复习,然而要准备的知识点很庞大,今天要讲的知识其中之一。一篇关于的解析文档笔记~知识汇总的PDF相关内容后续GitHub更新,想冲击金三银四的小伙伴可以找找看看,欢迎star顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

2401_84009529的博客 918

Handler消息机制:面试初级、中级、高级问法,你都掌握了吗?

view.setLayoutParams(wparams);mViews.add(view); mRoots.add(root); mParams.add(wparams);// do this last because it fires off messages to start doing things try { //ViewRootImpl root.setView(view, wparams, panelParentView); } catch (RuntimeException e) { //

2401_84895803的博客 2021
上一篇: Handler的用法和源码进行拆解,赶紧来瞧一瞧
下一篇: 聊聊 Kotlin 代理的“缺陷”与应对
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值