关于最近面试整理的学习题目
- 以下仅供参考,详情答案不唯一,看自己理解水平吧,当你点进这篇博客说明已经动了心思,祝你们马到成功!
- Android onTouchEvent, onClick及onLongClick的调用机制?
- 如何解决ScollView与Listview的事件冲突?
- Android在清单文件中设置启动模式与使用intent的setFlags设置哪个生效?
- Glide优点都有哪些?圆形裁剪怎么实现的?
- service怎么实现的?
- handler线程中只有一个looper和messagequeen吗?
- messagequeen中传入多个message怎样实现的先进先出?
- 一个Activity里有多个handler它是如何区分是由HandlerA发送的消息还是HandlerB发送的消息?
- 自定义View都有哪些?
- 自定义View自绘式都有哪些方法?
- 内存泄露在项目中都碰到哪些?如何解决的?
- 内存泄露都有哪些方法解决?
- 内存溢出都是哪些方面引起的?
- 内部类与静态内部类以及匿名内部类的区别?
- 多线程数据同步问题?
- gson字符串转对应对象?
- Android数据存储方式都有哪些?
- 一个App当中可以有多个进程嘛?
- A进程如何读B进程的存储内容?
- A线程如何堵到B线程的存储内容?
- 主线程可以同时处理多个消息吗?
- java抽象以及接口的区别?
- 线程与进程中间的区别?
- wait与sleep区别?
- handler流程?
以下仅供参考,详情答案不唯一,看自己理解水平吧,当你点进这篇博客说明已经动了心思,祝你们马到成功!
Android onTouchEvent, onClick及onLongClick的调用机制?
链接:详解链接
问:(一般和事件分发机制一起出现)Button的Click事件以及LongClick事件在onTouch中的按下、抬起、移动中的哪个方法执行?
- 答:onTouchEvent是最先执行Down以及Up事件,其次才会触发Click和LongClick。
LongClick是在Down的PostCheckForLongClick方法中,当长按事件执行后,系统会触发一个postDelayed操作,判断如果按下超过500s就会触发CheckForLongPress线程中的执行,如果条件都满足,那么就会执行perFormLongClick(),在这个方法中调用onLongClick();
Click是在Up发生后由perFormClick执行的,perFormClick会先调用注册的监听器的onClick方法执行。
如何解决ScollView与Listview的事件冲突?
链接:详情链接
- 答:
1、 解决方法是继承ListView,重写dispathTouchEvent方法,实现Move、Down,在其操作getParent().requestDisallowInterceptTouchEvent()设置为true,在Up、Cancel中设置getparent{}.requestDisallowInterceptTochEvent()设置为flase,就可以了;
2、 继承ScollView重写interceptTouchEvent,用getLocationInWindow获取ListView相对的位置,调用MotionEvent的getRawX及getRawy方法获取屏幕的坐标,在里判断ListView不等于null以及触摸到ListView的区域时设置为false,让子控件去处理。
Android在清单文件中设置启动模式与使用intent的setFlags设置哪个生效?
链接:详情链接
问:(一般和四种启动模式一起出现)假设我在清单文件中设置启动模式与我使用intent启动时设置,哪个生效呢?
- 答:在代码中的生效,就好比我们在xml中设置一个背景颜色,又在代码中设置一个,肯定是动态的代码生效。
Glide优点都有哪些?圆形裁剪怎么实现的?
- 答:glide使用的是RGB_565,采用链式调用,可以渐进式加载方式,使用三级缓存,优先查找内存中的图片,如果存在那么就显示,不存在就去磁盘中去查找,查找到,就存入内存中,没有的话就去网络加载,加载后显示图片并传给磁盘。
service怎么实现的?
- 答:servicer有startServer和BindServer,startServer是启动了,就会一直存在于后台,启动的生命周期是:onCreate–>onStartCommand–>onDestroy;BindServer是和Activity生命周期存在的,如果Activity被销毁了,那么onBindServer也就被销毁了,生命周期:onCreate–>
onBind—>onUnbind–>onDestroy。
区别:startService()启动Service如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。
bindService()启动Service,调用者和Service共存亡
handler线程中只有一个looper和messagequeen吗?
- 答:handler中只有一个looper,一个MessageQueen。
messagequeen中传入多个message怎样实现的先进先出?
- 答:在MessageQueen里有同步锁机制,如果同时发送一个消息,系统也会判断出谁先进入的,谁先进入谁就持有锁,从而实现先进先出。
一个Activity里有多个handler它是如何区分是由HandlerA发送的消息还是HandlerB发送的消息?
- 答:handler发送消息时,会携带对应的的handler对象,当looper去取消息时,会调用messageQueue中的消息,这个时候会调用enqueueMessage(),随后把this赋值给msg.target,此时的handler就指向了当前的handler。
- 错误说法:
创建sendMessage前要实例化Messageg,实例化的Message中有what方法,和arg1等方法wait是为了让handlerMessage接收消息时区分用的,arg1是传递的数据,这样来区分。
自定义View都有哪些?
- 答:继承式、自绘式、组合式
自定义View自绘式都有哪些方法?
- 答:onMeasure:测量View的大小、 onLayout:测量View的位置、 onDraw:用来绘制自身(背景、内容)
内存泄露在项目中都碰到哪些?如何解决的?
- 将 Handler 定义成静态的内部类,在内部持有 Activity 的弱引用,并及时移除所有消息。
内存泄露都有哪些方法解决?
- 造成内存泄露的原因是,如果长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄露。
解决办法:使用弱引用(内存不足时就会回收)、单例模式造成的泄露可以传入context.ApplicationContext(),让他随着整个App的存在而存在、handler造成的内存泄露使用弱引用在handlerMessage里进行判空处理
内存溢出都是哪些方面引起的?
- 答:
1、垃圾回收超时内存溢出(长时间无法回收无引用对象)
解决办法:要减少对象生命周期,尽量能快速的进行垃圾回收。
2、java堆内存溢出(jvm内存太小,对象所需要的内存过大)
解决办法:首先,如果代码没有什么问题的情况下,可以适当调整-Xms和-Xmx两个jvm参数,使用压力测试来调整这两个参数达到最优值。
其次,尽量避免大的对象的申请,像文件上传,大批量从数据库中获取,这是需要避免的,尽量分块或者分批处理,有助于系统的正常稳定的执行。 - 引申:内存溢出:(out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。
内存泄漏:(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果
内部类与静态内部类以及匿名内部类的区别?
- 答:1、内部类是直接可以访问外部类的静态以及非静态方法的。
2、静态内部类是可以直接被其他Activity调用,但是只能访问外部类的静态方法及成员变量。
3、匿名内部类是通过继承或者接口实现的,必须要与定义的类和实现的接口同时初始化。
多线程数据同步问题?
链接:详情链接
gson字符串转对应对象?
- 答:通过fromJson()实现对象的反序列化(即将json串转换为对象类型)
通过toJson()实现对象的序列化(即将对象类型转换为json串)
Android数据存储方式都有哪些?
- 答:SQLite、sp、上传接口、本地文件
一个App当中可以有多个进程嘛?
- 答:可以,在清单文件中设置开辟一个进程
A进程如何读B进程的存储内容?
- 答:使用广播,或者AIDL。
A线程如何堵到B线程的存储内容?
- 答:使用Handler、全局常量
主线程可以同时处理多个消息吗?
- 答:可以的,如果一个Activity当中发送了多个消息(cpu处理是纳秒/微秒),是可以处理的,我们创建Message时设置的what来区分sendMessage发送的消息在handlerMessage里用switch来选择处理。
java抽象以及接口的区别?
- 答:1、抽象方法必须被子类重写,抽象方法没有方法体, 2、接口当中实现的方法都是静态的
3、一个Activity可以实现多个接口,但只能继承在一个抽象类
线程与进程中间的区别?
- 答:进程是随着App的存在而存在,一个进程当中可以有多个线程,假如一个线程崩溃了,会影响到其他线程,而如果一个进程崩溃了,不会影响到其他进程,所以说,进程比线程要健壮。
wait与sleep区别?
- 答:wait是释放锁,而Sleep是持有锁;wait是Object的方法,Sleep是Thread的方法;sleep不会占用cpu,会让给其他线程。
handler流程?
链接:详情链接
- 答:handler.sendMessage发送message消息,传到messagequeen里,messagequeen通过looper轮询一个个消息,取出消息后,就会通过dispathmessage方法将消息分发出去,给到对应的handlerMessage去更新UI等。