当前位置:首页 > 安卓面试基础知识总结
12 什么是异步,什么是同步?分别在什么情况下使用?
? 比如:在子线程中执行数据加载,主线程中实现界面显示就是异步,这样
界面可以先显示出来,在后台加载完数据再填充界面,而同步则是在一个线程中,如果数据没有加载完,那么界面就不会展示,两个任务必须按顺序执行.
? 异步适合加载网络数据,或者大量数据
? 同步适合多线程访问或修改同一个数据,要保证数据修改前后的一致性
的时候使用.
13 开发中遇到过哪些异常?是如何处理的?
1. java.lang.NullPointerException 异常的解释是\程序遇上了空指针\,简
单地说就是调用了未经初始化的对象或者是不存在的对象,即把数组的初始化和数组元素的初始化混淆起来了。数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话)
2. java.lang.OutOfMemoryError: bitmap size exceeds VM budget 自动把眼睛跳动到OOM异常看去
3. java.lang.ClassNotFoundException 异常的解释是\指定的类不存在\。 4. java.lang.ArrayIndexOutOfBoundsException
算法异常,一般是被0除,logcat中一般有提示;
5. SQLException:操作数据库异常类,日志中一般会写出来执行什么语句有问
题,直接从代码中查找即可;
6. java.lang.IllegalArgumentException 这个异常的解释是\方法的参数错
误\,比如g.setColor(int red,int green,int blue)这个方法中的三个值,如果有超过255的也会出现这个异常,因此一旦发现这个异常,我们要做的,就是赶紧去检查一下方法调用中的参数传递是不是出现了错误。
7. java.lang.IllegalAccessException 这个异常的解释是\没有访问权限\,
当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了Package的情况下要注意这个异常
8. java.io.FileNotFoundException文件找不到异常,找到与自己写得类有关
的行号,双击进入找到相关代码,文件读写异常,一般是使用完流没有关流会产生的异常,检查流是否关闭?..
14 开发时是如何做屏幕适配的?
14.1 美工切图:两套图
一般切480*800和1280*720的图做屏幕适配。
14.2 屏幕适配
14.2.1 图片适配
不同的手机分辨率会找不同的drawable对应的目录, 在做屏幕适配时, 会把一些对应分辨率的图片放在drawable-某个手机的分支下. 14.2.2 布局适配
不同手机屏幕的大小不一样, 我们想让程序运行时, 布局也展示的不一样. 在res目录下创建layout-1280x720文件夹, 里边创建的布局文件就会加载在1280x720的手机屏幕上. 14.2.3 尺寸适配
在res下创建values目录, 跟着对应手机的分辨率.
android下单位: px像素, dip/dp与像素无关的单位密度.
密度比值: 密度比值 = 开跟(宽的平方 + 高的平方) / 屏幕的尺寸.
= 开跟(57600 + 102400) / 屏幕的尺寸. = 开跟(160000) / 屏幕的尺寸. = 400 / 2.7
= 148.14814814814814814814814814815 = 0.75
= 开跟(1638400 + 518400) / 屏幕的尺寸. = 开跟(2156800) / 屏幕的尺寸.
= 1468.6047800548655438793375614966 / 4.7 = 312.46910213933309444241224712693 = 2.
换算: px = dip * 密度比值;
在240*320手机上,
160dip * 0.75 = 120px;
在1280*720手机上,
160dip * 2 = 320px; 320dip * 2 = 640px
代码获取密度比值: density
Resources resources = getResources();
DisplayMetrics metrics = resources.getDisplayMetrics(); System.out.println(\密度比值: \14.2.4 权重适配 14.2.5 代码适配
代码中的默认没有dp这个尺寸,而像素不会根据尺寸匹配屏幕,可以通过工具类转换dp到px.
14.2.6 其他
? 在自定义控件中可以根据图片原有比例算出适合屏幕的尺寸来显示. ? 提供高清图片,放在一个屏幕比较适中偏小的文件夹中,如mdpi.(这样
可以解决图片过多,应用臃肿的现象)
15 开发时,是如何访问网络的?
15.1 一般在子线程中访问网络.
使用AsyncTask在doInBackground中访问网络.
15.2 URLConnection,HttpClient,AsyncHttpClient,Xutils使用get
或post方法发送请求,接收响应.获得流对象取得数据. 15.3 使用HttpURLConnection(URLConnection子类)
1)调用URL对象的openConnection()方法来创建URLConnection对象
2)设置URLConnection的参数和普通请求属性 3)发送GET或POST请求 4)通过输入流读取远程资源 5)关闭释放资源
15.4 HttpClient: Apache提供了一个HttpClient,用于发送HTTP
请求,接收HTTP响应。
使用HttpClient发送请求、接收响应,只需要以下几步:
1)创建HttpClient对象
2)如果需要发送get请求,创建HttpGet对象;如果发送post请求,创建HttpPost对象
3)发送参数,setParams(HttpParams params), 对于HttpPost,也可以调用setEntity(HttpEntity entity)来进行设置
4)httpClient.execute()发送请求,执行此方法返回HttpResponse对象 5)处理响应对象,调用HttpResponse的getEntity()获取HttpEntity对象,该对象封装了服务器响应内容
15.5 使用Socket通过Tcp或Udp访问网络.
1.基于TCP协议的Socket
服务器端首先声明一个ServerSocket对象并且指定端口号,然后调
用Serversocket的accept()方法接收客户端的数据。accept()方法在没有数据进行接收的处于堵塞状态。(Socketsocket=serversocket.accept()),一旦接收到数据,通过inputstream读取接收的数据。
客户端创建一个Socket对象,指定服务器端的ip地址和端口号(Socketsocket=newSocket(\),通过inputstream读取数据,获取服务器发出的数据(OutputStreamoutputstream=socket.getOutputStream()),最后将要发送的数据写入到outputstream即可进行TCP协议的socket数据传输。 2. 基于UDP协议的数据传输
服务器端首先创建一个DatagramSocket对象,并且指点监听的端口。接下来创建一个空的DatagramSocket对象用于接收数据
(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.length)),使用DatagramSocket的receive方法接收客户端发送的数据,receive()与serversocket的accepet()类似,在没有数据进行接收的处于堵塞状态。
客户端也创建个DatagramSocket对象,并且指点监听的端口。接下来创建一个InetAddress对象,这个对象类似与一个网络的发送地址(InetAddress serveraddress=InetAddress.getByName(\)).定义要发送的一个字符串,创建一个
DatagramPacket对象,并制定要讲这个数据报包发送到网络的那个地址以及端口号,最后使用DatagramSocket的对象的send()发送数据。*
共分享92篇相关文档