android获取视图(view)中第n个子元素的方法为_Android 面试题:Handler、自定义View、Java三大特性、分发机制、动画(第1期)...

本文总结了Android面试中常见的问题,包括Handler的正确使用、自定义控件优化方案、Java的封装、继承和多态,以及Android的事件分发机制和动画类型。同时,介绍了码个蛋社群的每日一问学习活动,旨在帮助开发者养成良好学习习惯。
摘要由CSDN通过智能技术生成
d4a4abb74acdd91dfb5046706c5ff975.gif 码个蛋(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");        }    }

自定义控件优化方案

  1. 为了加速你的view,对于频繁调用的方法,需要尽量减少不必要的代码。先从onDraw开始,需要特别注意不应该在这里做内存分配的事情,因为它会导致GC,从而导致卡顿。在初始化或者动画间隙期间做分配内存的动作。不要在动画正在执行的时候做内存分配的事情。

  2. 你还需要尽可能的减少onDraw被调用的次数,大多数时候导致onDraw都是因为调用了invalidate().因此请尽量减少调用invaildate()的次数。如果可能的话,尽量调用含有4个参数的invalidate()方法而不是没有参数的invalidate()。没有参数的invalidate会强制重绘整个view。

  3. 另外一个非常耗时的操作是请求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动画有几种,对其理解

  1. 视图动画。视图移动、view真真的位置并未移动。

  2. 帧动画。就和放电影一样,一帧一帧的播

  3. 属性动画。视图移动、其位置也会随着移动。

  4. 触摸返回动画。发生触摸事件时有反馈效果。比如波纹效果

  5. 揭露动画。从某一个点向四周展开或者从四周向某一点聚合起来。

  6. 转场动画 & 共享元素。比如切换activity。共享元素一般我们使用在转换的前后两个页面有共同元素时。

  7. 视图状态动画。就是 View 在状态改变时执行的动画效果

  8. 矢量图动画。在图片的基础上做动画。

  9. 约束布局实现的关键帧动画。就是给需要动画效果的属性,准备一组与时间相关的值。关键的几个值。

结束语

如果你有好的答案可以提交至:

https://github.com/codeegginterviewgroup/CodeEggDailyInterview

今日问题:

你觉得这个系列怎么样?

如果觉得不错可以点下“在看“,我统计一下人数。

12f682d89ebc96fc0a424c61020a222b.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值