内容简介:(授权转载)微信码个蛋授权转载以下原文:
(授权转载)微信码个蛋授权转载
以下原文:
码个蛋(codeegg)第 611 次推文
码个蛋,码上养成好习惯!
码个蛋社群升级已经将近两个月了,通过两个月的观察,感觉群友们每天学习的积极性都是很高的,每天的活跃度也很高(当然不是吹水)基本上大家讨论的都是跟学习相关的内容
期间通过群友投票,我们选出了 码个蛋 新的solgan: 码个蛋,码上养成好习惯!
为了帮助大家养成好习惯,码仔们自发在社群里提出了 每日一问! 每天一道面试题!然后收录大家的答案整合到一起,方便大家的学习和复习。
为了让大家更方便的找到每日问题,码仔决定在公号内推出一个新的文章系列: 《每周面试题总结》
这个系列是整合在码个蛋学习群里面的每日一题,这篇是第一周整理集合, 后续每周都会更新。
学习群详细可见:《社群升级:Max你的学习效率》
如何正确使用Handler?
Handler的工作是依赖于Looper的,而Looper(与消息队列)又是属于某一个线程(ThreadLocal是线程内部的数据存储类,通过它可以在指定线程中存储数据,其他线程则无法获取到),其他线程不能访问。因此Handler就是间接跟线程是绑定在一起了。因此要使用Handler必须要保证Handler所创建的线程中有Looper对象并且启动循环。因为子线程中默认是没有Looper的,所以会报错。正确的使用方法是:
private final class WorkThread extends Thread { private Handler mHandler; public Handler getHandler() { return mHandler; } public void quit() { mHandler.getLooper().quit(); } @Override public void run() { super.run(); //创建该线程对应的Looper, // 内部实现 // 1。new Looper() // 2。将1步中的lopper 放在ThreadLocal里,ThreadLocal是保存数据的,主要应用场景是:线程间数据互不影响的情况 // 3。在1步中的Looper的构造函数中new MessageQueue(); //其实就是创建了该线程对用的Looper,Looper里创建MessageQueue来实现消息机制 //对消息机制不懂得同学可以查阅资料,网上很多也讲的很不错。 Looper.prepare(); mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); Log.d("WorkThread", (Looper.getMainLooper() == Looper.myLooper()) + "," + msg.what); } }; //开启消息的死循环处理即:dispatchMessage Looper.loop(); //注意这3个的顺序不能颠倒 Log.d("WorkThread", "end"); } }
自定义控件优化方案
为了加速你的view,对于频繁调用的方法,需要尽量减少不必要的代码。先从onDraw开始,需要特别注意不应该在这里做内存分配的事情,因为它会导致GC,从而导致卡顿。在初始化或者动画间隙期间做分配内存的动作。不要在动画正在执行的时候做内存分配的事情。
你还需要尽可能的减少onDraw被调用的次数,大多数时候导致onDraw都是因为调用了invalidate().因此请尽量减少调用invaildate()的次数。如果可能的话,尽量调用含有4个参数的invalidate()方法而不是没有参数的invalidate()。没有参数的invalidate会强制重绘整个view。
另外一个非常耗时的操作是请求layout。任何时候执行requestLayout(),会使得Android UI系统去遍历整个View的层级来计算出每一个view的大小。如果找到有冲突的值,它会需要重新计算好几次。另外需要尽量保持View的层级是扁平化的,这样对提高效率很有帮助。如果你有一个复杂的UI,你应该考虑写一个自定义的ViewGroup来执行他的layout操作。与内置的view不同,自定义的view可以使得程序仅仅测量这一部分,这避免了遍历整个view的层级结构来计算大小。这个PieChart 例子展示了如何继承ViewGroup作为自定义view的一部分。PieChart 有子views,但是它从来不测量它们。而是根据他自身的layout法则,直接设置它们的大小。
谈谈你对Java三大特性的理解
封装
封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”。
被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。
多态
多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
实现多态,有二种方式,覆盖,重载。
覆盖,是指子类重新定义父类的虚函数的做法。
重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
谈谈Android的事件分发机制
事件的传递流程:
Activity(PhoneWindow)->DecorView->ViewGroup->View。
事件分发过程中三个重要的方法:
dispatchTouchEvent()、onInterceptTouchEvent()、onTouchEvent();
事件传递规则
一般一次点击会有一系列的MotionEvent,可以简单分为:down->move->….->move->up,当一次event分发到ViewGroup时,ViewGroup收到事件后调用dispatchTouchEvent,在dispatchTouchEvent中先检查是否要拦截,若拦截则ViewGroup处理事件,否则交给有处理能力的子容器处理。
Android动画有几种,对其理解
视图动画。视图移动、view真真的位置并未移动。
帧动画。就和放电影一样,一帧一帧的播
属性动画。视图移动、其位置也会随着移动。
触摸返回动画。发生触摸事件时有反馈效果。比如波纹效果
揭露动画。从某一个点向四周展开或者从四周向某一点聚合起来。
转场动画 & 共享元素。比如切换activity。共享元素一般我们使用在转换的前后两个页面有共同元素时。
视图状态动画。就是 View 在状态改变时执行的动画效果
矢量图动画。在图片的基础上做动画。
约束布局实现的关键帧动画。就是给需要动画效果的属性,准备一组与时间相关的值。关键的几个值。
结束语
如果你有好的答案可以提交至:
https://github.com/codeegginterviewgroup/CodeEggDailyInterview
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learning Vue.js 2
Olga Filipova / Packt Publishing / 2017-1-5 / USD 41.99
About This Book Learn how to propagate DOM changes across the website without writing extensive jQuery callbacks code.Learn how to achieve reactivity and easily compose views with Vue.js and unders......一起来看看 《Learning Vue.js 2》 这本书的介绍吧!