Android 3.29面试题

2021-11-20  本文已影响0人  我要离开浪浪山

1. 实体类中使用set/get与直接调用变量相比有什么区别,有哪些好处?

2. 线程的sleep()和wait()有什么区别,举两个简单的使用场景。

它们最大本质的区别是:sleep()不释放同步锁,wait()释放同步锁.

还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;

wait()可以用notify()直接唤起. sleep和wait的区别还有:
1、这两个方法来自不同的类分别是Thread和Object
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用, 而sleep可以在 任何地方使用

synchronized(x){        
x.notify()       
//或者wait()    
} 

4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

3. 字节流和字符流使用场景的区别。

InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象, Reader和 Writer.两个是为字符流(一个字符占两个字节)设计的,主要用来处理字符或字符串. 字符流处理的单元为2个字节的Unicode字符,操作字符、字符数组或字符串, 字节流处理单元为1个字节,操作字节和字节数组。 所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的, 所以它对多国语言支持性比较好! 如果是音频文件、图片、歌曲,就用字节流好点, 如果是关系到中文(文本)的,用字符流好点

1.字节流在操作时不会用到缓冲区(内存),是直接对文件本身进行操作的。而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
2.在硬盘上的所有文件都是以字节形式存在的(图片,声音,视频),而字符值在内存中才会形成。

4. ConcurrentHash如何做到高效且线程安全的?

5. 列出造成内存泄露的原因,并给我解决方案

内存溢出的原因以及解决方法

引起内存溢出的原因有很多种,小编列举一下常见的有以下几种:

1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收; 3.代码中存在死循环或循环产生过多重复的对象实体; 4.使用的第三方软件中的BUG; 5.启动参数内存值设定的过小

内存溢出的解决方案:

第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)

第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。

第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。

6. 请尽可能详细描述自定义view的步骤

7. 界面在栈下部被系统回收后,返回此界面的时候如何恢复数据?

重写onSaveInstanceState()方法,在此方法中保存需要保存的数据,该方法将会在activity被回收之前调用。通过重写onRestoreInstanceState()方法中提取保存好的数据。

8. 开发过程中如何快速的定位造成UI卡顿的原因?

下面总结一些常见的UI卡顿原因:

一、外部因素引起的(以View为区分)

  1. 内存抖动的问题

  2. 方法太耗时了(CPU占用)

二、View本身的卡顿

Android使用消息机制进行UI更新的,如果在主线程handler的dispatchMessage方法进行了耗时操作,就会发生UI卡顿。

9. 了解哪些热更新框架?大致描述一种或多种安卓热更新的实现方式。

10.Android 线程间通信有哪几种方式**

1)共享变量(内存)
2)管道
3)handle机制

11.Devik 进程,linux 进程,线程的区别**

Dalvik进程。

每一个android app都会独立占用一个dvm虚拟机,运行在linux系统中。

所以dalvik进程和linux进程是可以理解为一个概念。

12.描述一下 android 的系统架构**

从小到上就是:

linux kernel,lib dalvik vm ,application framework, app

13.android 应用对内存是如何限制的?我们应该如何合理使用内存?**

activitymanager.getMemoryClass() 获取内存限制。

关于合理使用内存,其实就是避免OOM & 内存泄露中已经说明。

14. 简述 android 应用程序结构是哪些**

1)main code
2)unit test
3)mianifest
4)res->drawable,drawable-xxhdpi,layout,value,mipmap
mipmap 是一种很早就有的技术了,翻译过来就是纹理映射技术.
google建议只把启动图片放入
5)lib
6)color

15.请解释下 Android 程序运行时权限与文件系统权限的区别

16.Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么

Framework是android 系统对 linux kernel,lib库等封装,提供WMS,AMS,bind机制,handler-message机制等方式,供app使用。

简单来说framework就是提供app生存的环境。

1)Activity在attch方法的时候,会创建一个phonewindow(window的子类)
2)onCreate中的setContentView方法,会创建DecorView
3)DecorView 的addview方法,会把layout中的布局加载进来。

17.多线程间通信和多进程之间通信有什么不同,分别怎么实现**

线程间的通信可以参考第6点。

进程间的通信:bind机制(IPC->AIDL),linux级共享内存,boradcast,

Activity 之间,activity & serview之间的通信,无论他们是否在一个进程内。

18.Android 屏幕适配**

屏幕适配的方式:xxxdpi, wrap_content,match_parent. 获取屏幕大小,做处理。

dp来适配屏幕,sp来确定字体大小

drawable-xxdpi, values-1280*1920等 这些就是资源的适配。

wrap_content,match_parent, 这些是view的自适应

weight,这是权重的适配。

19.什么是 AIDL 以及如何使用**

Android Interface Definition Language

AIDL是使用bind机制来工作。

参数:

java原生参数

String

parcelable

list & map 元素 需要支持AIDL

20.如何修改 Activity 进入和退出动画**

overridePendingTransition

21.SurfaceView & View 的区别

view的更新必须在UI thread中进行

surfaceview会单独有一个线程做ui的更新。

surfaceview 支持open GL绘制。

22、 什么情况会导致Force Close ?如何避免?能否捕获导致其的异常?

答:程序出现异常,比如nullpointer。
避免:编写程序时逻辑连贯,思维缜密。能捕获异常,在logcat中能看到异常信息

上一篇下一篇

猜你喜欢

热点阅读