详细说一下 MeasureSpec.UNSPECIFIED 前面的文章 我留下了一个疑惑,那就是到底为什么 NestedScrollView 要把子 View 的测量模式强行设置为 MeasureSpec.UNSPECIFIED ,这不,在鸿洋的 "wanAndroid" 中,他再次提出了这样的问题: MesureSpec.UNSPECIFIED 这个模式什么时候会遇到? 遇到后怎么处理? 有什么注意事项? 下面摘自用户「陈小缘啦啦啦」的回答,我觉得回答的非常到位,特别在这里和大家分享…
作为一名 Android 开发,正常情况下对 View 的绘制机制基本还是耳熟能详的,尤其对于经常需要自定义 View 实现一些特殊效果的同学. 网上也出现了大量的 Blog 讲 View 的 onMeasure().onLayout().onDraw() 等,虽然这是一个每个 Android 开发都应该知晓的东西,但这一系列实在是太多了,完全不符合咱们短平快的这个系列初衷. 那么,今天我们就来简单谈谈 measure() 过程中非常重要的 MeasureSpec. 对于绝大多数人来说,都是知道…
前面的文章中着重讲解了 View 的测量流程.其中我提到了一句非常重要的话:View 的测量匡高是由父控件的 MeasureSpec 和 View 自身的 `LayoutParams 共同决定的.我们在前面的 每日一问:谈谈对 MeasureSpec 的理解 把 MeasureSpec 的重点进行了讲解,其实另外一个 LayoutParams 同样是非常非常重要. 从概念讲起 LayoutParams,顾名思义,就是布局参数.而且大多数人对此都是司空见惯,我们 XML 文件里面的每一个 View…
Android 开发中经常需要用一些自定义 View 去满足产品和设计的脑洞,所以 View 的绘制流程至关重要.网上目前有非常多这方面的资料,但最好的方式还是直接跟着源码进行解读,每日一问系列一直追求短平快,所以本文笔者尽量精简. 想必大多数 Android 开发都知道自定义 View 需要关注的几个方法:onMeasure().onLayout() 和 onDraw(),这其实也是每个 View 至关重要的绘制流程. 基本绘制都是会从根视图 ViewRoot 的 performTravers…
坚持原创日更,短平快的 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 虚拟机…
永远不变的就是变. 俗话说的好,环境改变人生. 常常面对的是一群积极奋进的人,那么你的心态和生活也会变的充满斗志.青春在于折腾,趁我们还年轻,拿出你的激情.踏着泪水载着梦,才干拥有自己的一片天空. 上上上周,有机会增加了一个比較小的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()…
问:请介绍一下Python中的 import 机制 答: import 语句结合了两个操作:1.它先搜索指定名称的模块 2.将搜索结果绑定到当前作用域中的名称. 如果指定名称的模块未找到,则会引发 ModuleNotFoundError 导入方法: (1)# 导入一个模块 import model_name (2)# 导入多个模块 import module_name1, module_name2,... (3)# 导入模块中的指定的属性.方法(不加括号).类 from moudule_name…
问:请简述一下python的GIL 答:GIL 锁,全局解释器锁,仅在CPython解释器中,作用就是,限制多线程同时执行,保证同一时间内只有一个线程在执行.…
问:请解释线程.进程.协程 答: [定义] 进程 进程:一个运行的程序(代码)就是一个进程,进程是系统资源分配的最小单位.进程拥有自己独立的内存空间,多个进程间资源不共享 线程 线程:调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在.一个进程里至少有一个线程,叫主线程,一个进程里所有线程共享资源(数据共享,共享全局变量),从而极大地提高了程序的运行效率. 协程 协程:又称微线程,是一种用户态的轻量级线程,协程的调度完全由用户控制.协程的本质是个单线程. [资源共享是否共享] 进程 进…
问: 请简单说明一下以下代码的执行过程以及最终的输出结果 def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b # 相当于 t=(b,a+b),a = t[0],b = t[1] n = n + 1 f = fib(10) print("== start ==") print(f.__next__()) print(f.__next__()) print(f.__next__()) 代码的执行…
问:请解释一下迭代器 答:可以被 __next__() 函数调用并不断返回下一个值的对象称为迭代器:Iterator…
问:请分别写一段Python代码实现一下功能: (1)计算一个文件中的大写字母数量 (2)输入中文,返回相应的拼音,并写入文件中 答: (1)计算一个文件中的大写字母数量 file_name = "upper.txt" with open(file_name,"r+",encoding="utf-8") as f: contents = f.read() count = 0 for char in contents: if char.isuppe…
问:请解释使用 *args 和 **kwargs 的含义 答: *args:可变参数,表示将实参中按照位置传值,多余的值都给 args,多余的实参被打包成 tuple(元组),然后传递给函数调用 # 定义函数 def func(a,b,*args): pass func(1,2,c,d,e) # 1被赋值给a,2被赋值给b, # c,d,e被打包成元组,存在args中 **kwargs:关键字参数,表示形参中按照关键字传值,多余的值(以 k=v 的 形式)都给 kwargs,多余的关键字实参被打…
问:简述Python文件打开模式 r. w. a. r+.w+.a+之间的区别 答: 1.只读模式 r 文件存在:只读打开,只能执行读操作 文件不存在:报错 # ######## 只读模式r ######## filename = "file_test1" # 打开文件 f = open(filename, "r", encoding="utf-8") # 读文件 print(f.read()) # 关闭文件 f.close() 2.只写模式 w…
问:请解释一下Python 中的 pass 语句.continue.break有什么作用?并辅以代码说明 答: 1.pass :pass是空语句,是为了保持程序结构的完整性.通常用于不知道接下来代码应该写什么,而采用的辅助性代码,保证代码的完整性而不会报错. if a > b: pass else: pass # 当我们有了大概的思路,可以用pass来做占位符 2.break (1)用于 while 和 for 循环中 (2)用于完全结束一个循环,跳出循环体 不管是哪种循环,一旦在循环体中遇到…
问:a =  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],求出列表a中所有奇数并构造新列表 答: 利用列表的元素下标遍历列表 a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 创建一个空列表b b = [] # 遍历列表的元素下标 for i in range(0, len(a)): if a[i] % 2 == 1: # 判断是否是元素是否是奇数 b.append(a[i]) # 使用 append()方法将符合条件的元素追加到列表b中 print…
问:请给出下列代码的执行结果,并解释 a = dict.fromkeys([6, 7, 8], ["testing", {"name": "ken"},123]) print(a) a[7][1]["name"] = "sucy" print(a) 答: {6: ['testing', {'name': 'ken'}, 123], 7: ['testing', {'name': 'ken'}, 123],…
问:列表 test = [1,2,3,1,3,4,5,67,7,8,54,1,2,3,4,5,6],如何删除该列表的重复元素? 方法1:利用集合的不重复性 # 利用集合的不重复性 test = [1,2,3,1,3,4,5,67,7,8,54,1,2,3,4,5,6] # 将 列表 转换成 集合,再将集合 转换成 列表 test1 = list(set(test)) print(test1) 如果要保持列表的原有顺序,可以使用 sort 方法: # 利用集合的不重复性 test = [1,2,3…
问:深拷贝.浅拷贝.直接赋值的区别是什么?并举例说明 1.区别 (1)直接赋值:对象的引用 (2)浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象 (3)深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象 定义说得有点抽象,简而言之: 深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用. 假设B复制了A,修改A的时候,看B是否发生变化: (1)如果B跟着也变了,说明是浅拷贝, (2)如果B没有改变,说明是深拷贝 2.…
问: [基础题]:简述Python的异常处理机制[提高题]:请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 答: [基础题]:简述Python的异常处理机制 Python的异常处理机制: try: 尝试抛出异常; raise: 引发异常; except: 处理异常; finally: 是否发生异常都需要做的事情; 创建新的异常类型, 需要继承Exception类, 可以定义类的属性, 便于…
问: [基础题]TCP/UDP/HTTP协议区别 [提高题]在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 答: [基础题]TCP/UDP/HTTP协议区别 TCP 和 UDP 是传输层协议,HTTP 是应用层协议. TCP 是面向连接的,可靠的,有着三次握手四次挥手的机制. UDP 相比之下更注重传输效率,一般大流量视频,图片采用 UDP,是一种不可靠的,无连接的协议. HTT…
问: 基础题: 定义函数实现以下功能:求出 0-n 所能组成的奇数个数,位数最多 n+1 (0<n<10),比如键盘输入n=7,求出0-7所能组成的奇数个数 提高题: 有如下分数序列: 2/1 , 3/2 , 5/3 , 8/5 , 13/8 , 21/13... 求出这个数列的前 N 项之和,N由键盘输入 答: 基础题: 定义函数实现以下功能:求出 0-n 所能组成的奇数个数,位数最多 n+1 (0<n<10),比如键盘输入n=7,求出0-7所能组成的奇数个数 # 判断 0-n…
问: 基础题: 从键盘输入4个数字,各数字采用空格分隔,对应为变量x0,y0,x1,y1.计算(x0,y0)和(x1,y1)两点之间的距离,输出结果保留1位小数. 比如,键盘输入:0 1 3 5,屏幕输出:5.0 提高题: 键盘输入小明学习的课程以及考试分数信息,信息之间采用空格分隔,每个课程一行,空格回车结束录入,示例格式如下: 数学 90 语文 95 英语 86 物理 84 生物 87 输出得分最高和最低的课程名称.考试分数,以及所有课程的平均分(保留2位小数) 格式如下: 最高分课程是语文…
坚持原创日更,短平快的 Android 进阶系列,敬请直接在微信公众号搜索:nanchen,直接关注并设为星标,精彩不容错过. 一般我们被问到这样的问题,通常来说,答案都是否定的,但一定得知道其中的原因,不然回答肯定与否又有什么意义呢. 首先,显而易见这个问题有不少陷阱,比如这个 View 是自己构造出来的,那肯定它的 getContext() 返回的是构造它的时候传入的 Context 类型. 它也可能返回的是 TintContextWrapper 那,如果是 XML 里面的 View 呢,会…