前面的文章中着重讲解了 View 的测量流程.其中我提到了一句非常重要的话:View 的测量匡高是由父控件的 MeasureSpec 和 View 自身的 `LayoutParams 共同决定的.我们在前面的 每日一问:谈谈对 MeasureSpec 的理解 把 MeasureSpec 的重点进行了讲解,其实另外一个 LayoutParams 同样是非常非常重要. 从概念讲起 LayoutParams,顾名思义,就是布局参数.而且大多数人对此都是司空见惯,我们 XML 文件里面的每一个 View…
坚持原创日更,短平快的 Android 进阶系列,敬请直接在微信公众号搜索:nanchen,直接关注并设为星标,精彩不容错过. 我 17 年的 面试系列,曾写过一篇名为:Android 面试(五):探索 Android 的 Handler 的文章,主要讲述的是 Handler 的原理相关面试题,然后简单地给与了一些结论.没想到两年过去,我又开启了 面试系列 的翻版 每日一问 专题,而这一次的卷土重来,只是为了通过源码来探知我们平时可能忽略掉的细节. 我们在日常开发中,总是不可避免的会用到 Han…
这是 wanAndroid 每日一问中的一道题,下面我们来尝试解答一下. 讲讲并发专题 volatile,synchronize,CAS,happens before, lost wake up 为了本系列的「短平快」,今天我们就来第一个主角:volatile. 保证内存可见性 前面我们讲到:Java 内存模型分为了主内存和工作内存两部分,其规定程序所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(赋值.读取等…
昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前,我们一定得确定哪些是活着的对象,又有哪些是可以进行回收的. 判断对象是否存活方式 引用计数算法 对应判断一个对象是否可以回收,我想引用计数一定是最容易被想到的算法了吧.给每个对象加一个引用计数器,每当有一个地方引用它时,计数器就加 1,引用失效后减 1,当对象的计数器为 0,则说明这个对象可以被回…
对于从事 C/C++ 程序员开发的小伙伴来说,在内存管理领域非常头疼,因为他们总是需要对每一个 new 操作去写配对的 delete/free 代码.而对于我们 Android 乃至 Java 程序员,却总是会因为虚拟机的自动内存管理机制而忽视内存管理的重要性. 经过前面简短的几篇纯 Android 问题,我想再给大家掺杂一点可能平时你并没有太多关注的东西.其实写这个的时候我相当纠结,因为对于大多数 Android 开发来说,他们会更加注重实质性的技能提升,而不是我今天将要讲的 Java 虚拟机…
Android 开发中经常需要用一些自定义 View 去满足产品和设计的脑洞,所以 View 的绘制流程至关重要.网上目前有非常多这方面的资料,但最好的方式还是直接跟着源码进行解读,每日一问系列一直追求短平快,所以本文笔者尽量精简. 想必大多数 Android 开发都知道自定义 View 需要关注的几个方法:onMeasure().onLayout() 和 onDraw(),这其实也是每个 View 至关重要的绘制流程. 基本绘制都是会从根视图 ViewRoot 的 performTravers…
永远不变的就是变. 俗话说的好,环境改变人生. 常常面对的是一群积极奋进的人,那么你的心态和生活也会变的充满斗志.青春在于折腾,趁我们还年轻,拿出你的激情.踏着泪水载着梦,才干拥有自己的一片天空. 上上上周,有机会增加了一个比較小的andorid 开发群,群内活力充足,每日有不常见面试题.深入android 源代码的问题.由群主发起.各路大神讨论,为菜鸟(比方我)普及android知识.每日进步一点点,慢慢积累自己的財富~ 本文收集题目来自:wing_Android 技术交流群(42598369…
面试结束时面试官问"你有什么问题需要问我呢",该如何回答?…
问:简述with方法打开处理文件实际上做了哪些工作 答: filename= "test.txt" with open(filename, "w", encoding="utf-8") as f: f.write("test code") 相当于 filename= "test.txt" file = open(filename,"w") try: file.write("te…
问:请解释一下装饰器的本质.功能 答: 1.装饰器的本质:闭包函数 2.装饰器的功能:在不改变函数本体结构.调用方法的情况下,给函数添加额外的功能 3.装饰器的实现方式 装饰器的实现方式一般是: def inter(f): def outer(): pass #新增功能代码块 return outer 然后在需要增加功能的函数上方加上 @ inter @inter def test1(): pass @inter def test2(name): pass #不改变函数的调用方式 test1()…