Android面试知识点归纳

一、ListView的优化处理
    (1)复用getView(View convertView)中的View对象
    分析:每次填充数据时都会创建一个View对象
LayoutInflater mInflater = LayoutInflater.from(context);
convertView = this.mInflater.inflate(R.layout.datatemp_planview, null);  
首次创建convertView对象后,下次即可复用。
 
(2)ViewHolder类的使用
分析:创建辅助类ViewHolder,可减少FindViewById的使用,减少内存开销.
convertView.setTag(viewHolder);
viewHolder=convertView.getTag();
 
(3)数据分批加载
分批加载数据,需要时再加载下一页,缩短等待时间
 
(4)分页加载
针对大量数据的情况比如10万条数据,一次性加载或者分批加载都可能导致OOM,这时
需要使用分页加载,比如分成1000页,每页数据覆盖上一页的数据,每页再采用分批
加载,大大缩小内存需求
 
二、OOM是什么,如何避免
Out Of Memory(OOM):内存泄漏。
原因:(1)对象占用大量内存,如BitMap
 (2)对象得不到释放,如IO流、数据库Cursor没有关闭;Bitmap使用后未调用recycle()。 
    避免措施:(1)强制关闭IO流和数据库Cursor
 (2)压缩图片:BitmapFactory.Optiions的inJustDecodeBounds可做边界压缩,设置
Options.inSampleSize可设置压缩比
 (3)调用第三方开源库Universal-Image-Loader加载大图片,可实现图片的三级缓存
。其维护了一个LinkedHashMap和maxSize;可将当前的size与maxSize来移除最早
图片。

三、图片的预加载
在加载大图片时往往比较耗费时间,这时需要显示一张未加载成功时的图片,等到请求的图片加载成功
再为ImageView设置资源。

四、AsyncTask的工作原理
AsyncTask是异步处理的封装类,使用该类可以不去关心handler和Thread,其主要的方法包括:
onPreExecute():在UI线程中调用,Task一启动便调用这个方法,可以在该方法中建立一个任务
doInBackground(Params...):在后台线程中调用,该方法中可以做一些耗时的事情,文件、数据库操作等,
可通过publishProgress(Progress...)方法来调用当前任务的进度
onProgressUpdate(Progress...):在UI线程中运行,用来执行与UI相关的操作
onPostExecute(Result):Task结束时调用,运行在UI线程
cancel():取消任务,可用isCancel()来判断当前任务是否取消,调用cancel()后不再调用onPostExecute();
注意事项:
(1)onPreExecute、doInBackground、onProgressUpdate、onPostExecute等方法不需要手动调用
(2)AsyncTask对象必须在UI线程中创建,execuse()方法必须在UI线程中调用
(3)任务只能调用一次

五、Handler机制
Handler:处理者,负责消息的发送和处理
Message:信息体
MessageQueue:消息队列,先进先出
Looper:队列管理者,负责向MessageQueue中添加和获取Message,通过Looper.prepare()和Looper.loop()
  实现消息轮询
Thread:负责消息调度

六、Fragment的生命周期函数
onAttach():Activity与Fragment建立绑定
onCreate():创建Fragment
onCreateView():初始化界面,创建Fragment界面
onActivityCreated():当Activity的onCreate()方法被调用
onStart():开启Fragment
onResume():Fragment在Activity中可见
onPause():Fragment透明
onStop():Fragment被删除,但仍然中内存中
onDestroyView():Fragment的布局被删除
onDestroy():Fragment被删除
onDetach():Activity与Fragment解除绑定

七、SQLite的应用
(1)创建数据库管理类MySqlExecuse extends SQLiteOpenHelper
(2)获得SQLiteDatabase对象  db=mySqlExecuse.getWritableDatabase();
(3)db.insert() query() delete() update();

八、Andorid的mvc设计模式
MVC:Mode View Controller 
Mode:数据处理层,业务逻辑层
View:界面显示层
Controller:业务控制层,通常为Activity,响应时间为5s,所以尽量让Activity简单,将逻辑封装到Mode层

九、Android下的国际化理解
只需要在value文件加下定义如下的xml文件:values-zh,values-en,values-js...等等,格式values-国家代码

十、强引用、软引用、弱引用、虚引用
强引用:new 一个对象,只要改对象在使用中就不会被GC回收
软引用:SoftReference<Object> 内存不足时回收,常用于图片缓存
弱引用:WeakReference<Object> 只要检测到就回收
虚引用:PhantomReference<Object> 任何时候都可能被回收 必须和ReferenceQueue联合使用,被回收时如果该
对象持有虚引用,则会将这个虚引用添加在ReferenceQueue中,故可以通过检测ReferenceQueue中是否有
该应用可以跟踪对象是否被回收

十一、Intent 信使
属性:Action、Data、Category、Type、Compent、Extra
Action:要执行的动作,字符串方式存在
Data:执行动作的URI和MIME类型
Category:Action的附加信息
Type:显式指定Intent的数据类型(MIME)
Extra:添加附加信息,常用来传递数据
Compent:组件名称


十二、OSI七层模型和TCP/IP模型
OSI:Open System Interconnect 简称OSI,包括:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
TCP/IP:网络接入层、网际互联层、传输层、应用层
网际互联层:包括 网际协议IP、互联网组管理IGMP、互联网组报文ICMP
传输层:传输控制协议TCP、用户数据报协议UDP


十三、Socket通信
客户端:Socket scoket=new Socket(ip,port);
服务端:ServerSocket serverSocket=new ServerSocket(port);
Socket socket=serverSocket.accept()
 
十四、HTTP协议
Hyper Text Transfer Protocol的缩写HTTP(超文本传输协议),由W3C制定和维护,版本1.0 1.1
响应码:
200:一切正常
302/307:请求的资源路径变更了
304:资源没有被修改过
404:资源不存在,找不到资源
500:服务器程序有错

十五、Android线程池
ThreadPoolExecutor(int corePoolSize,                    //核心线程池大小
                       int maximumPoolSize,                 //最大线程池大小
                       long keepAliveTime,                  //线程池中,超过corePoolSize的空闲线程存活的时间
                       TimeUnit unit,                       //时间单位
                       BlockingQueue<Runnable> workQueue,   //阻塞任务队列LinkBlockingQueue ArrayBlockingQueue
                       ThreadFactory threadFactory,         //负责创建线程的工厂
                       RejectedExecutionHandler handler){ } //提交任务数大于maximumPoolSize+workQueue时,交由
//RejectedExecutionHandler处理

    四种常用线程池:
newFixedThreadPool             //固定大小线程池,超过的任务缓存在LinkedBlockingQueue中,无界
newCachedThreadPool            //缓存功能的线程池,使用SynchronousQueue,任务提交后创建新的线程
newSingleThreadExecutor        //单线程池,LinkedBlockingQueue,保证任务由一个线程顺序执行
ScheduledThreadPoolExecutor    //定时功能的线程池,DelayedWorkQueue无界

十六、Android中去除标题
(1)代码添加:requestWindowFeature(Window.FEATURE_NO_TITLE);在setContentView()之前
(2)AndroidManifest.xml文件中在<application>或者<activity>中<android:theme="@android:style/Theme.NoTitleBar">
(3)style.xml中添加样式:<item name="android:windowNoTitle">true</item> 然后在AndroidManifest.xml中添加样式

十七、Android适配
方案(1):图片适配,可在res文件夹的drawable文件夹下存放多种像素密度的图片
方案(2):字体适配:在res文件夹下的values文件夹下建立value-像素密度的文件,如:demens-800x480,dimens-1280x720
方案(3):布局适配:在layout的文件夹下建立 layout-密度的文件,如 layout-800x480,layout-1280x720 不常用
方案(4):java代码适配:通过API获得当前屏幕的宽和高,按比例分配屏幕中控件的高宽,如果控件较多就变得不现实
方案(5):权重适配:通过权重对控件进行布局可实现一份布局多处适用
 
注意事项:(1)单位采用dp
  (2)采用相对、线性、帧布局
  (3)采用ScrollView包裹内容过多的控件
  (4)在AndroidManifest.xml中添加:
<supports-screens
android:largeScreens="true"
android:normalScreens="true" 
android:smallScreens="true"
android:anyDensity="true">
</supports-screens>
 
十八、Android下的四种启动模式
standard:每次startActivity都创建一个新的Activity
singleTop: 单一顶部,如果要创建的Activity已经在顶部则调用onNewIntent()复用当前的Activity,而不是创建新的
singleTask:单一任务栈,如果要创建的Activity已经在当前任务栈中则复用该Activity,如果不在顶端则将其上的Activity移除
singleInstance:单例,只会运行在自己独立的任务栈中,该任务栈只有该单例存在

十九、Android 切屏
(1)不设置Activity的android:configChanges时,onpause--onStop--onDestroy--onCreate--onStart--onResume
切屏会重新调用Acivity的生命周期,横屏1次,竖屏2次
(2)设置Activity的android:configChanges="orientation" 横竖切屏各执行一次生命周期函数
(3)设置Activity的android:configChanges="orientation|keyboardHidden"时,不会执行,只会调用onConfigurationChanged方法
(4)android:configChanges=”orientation|screenSize|keyboardHidden”
写死:android:screenOrientation=”landscape”横屏或者portrait竖屏,指定应用为横屏或者竖屏
代码设置:setRequestOrientation(ActivityInfo.screen_orientation_landscape|portrait);
 
二十、Dalvik和java的JVM
 1、架构不同:JVM使用栈架构;Dalvik使用的是寄存器,数据是加载到CPU的寄存器上的。
 2、JVM加载的.class文件,Dalvik加载的是.dex文件,对内存的分配情况做了优化。
Android:.java-->.class-->.dex-->.apk
Java:   .java-->.class-->.jar
 
二十一、Java中jvm的内存分配
 堆区:new 出来的对象,每个对象对应一个class文件,反射时便是通过这个class文件来找到类中的信息
 栈区:基本数据类型、对象的引用,每个线程包含一个栈区,彼此之间不能访问
 共享区域:存放整个应用中唯一的元素
 
二十二、一个对象在内存中产生过程
Person persoon=new Person();
A 因为new用到了Person.class类,所以先找到Person.class类文件,并加载到内存的方法区中
B 执行该类的static代码块。如果有的话,给Person.class类进行初始化
C new Pseron()在堆内存中开辟空间,分配内存地址。
D 在堆内存中的建立对象的特有属性,并进行默认的初始化。
E 对属性进行显示初始化。
F 对对象进行构造代码块初始化。
G 对对象进行对应的构造函数初始化。
H 将堆内存地址赋给栈内存中P变量。
 
二十三、抽象类与接口
共性:都是抽象的概念
不同:
   (1)抽象类与实现之间是继承关系,而接口与实现之间是实现关系
   (2)抽象只能被单继承,接口可实现多个
   (3)抽象类是对事物的抽象,接口是对行为的抽象
   (4)抽象类可以有自己的静态代码块和方法,接口中只能有抽象的方法
   (5)抽象类可以定义抽象方法供子类直接使用,也可以定义非抽象方法
   (6)接口中的方法子类需要全部实现,抽象类则不需要

二十四、java中的三大特性
    封装:将对象封装成一个类,并将属性和行为封装成该类的成员与方法,实现高内聚
继承:多个对象具有相同的属性和行为,则通过继承父类来实现
多态:继承同一父类或实现同一接口的对象具有不同的表现形态
 三种方式:实现接口、继承父类、重写方法

二十五、final、finally、finalize
    final:修饰符,被修饰的类、方法、变量不能被继承、重写、改变
finally:异常处理语句块,除了遇到system.exit(0),其他情况在方法结束前都会被调用,用于释放资源
Finalize:垃圾回收方法,被GC调用

二十六、StringBuffer与StringBuilder
(1)StringBuffer有锁机制,是线程安全的,而StringBuilder没有锁,是线程不安全的
(2)StringBuilder比StringBuffer效率高,故单线程使用StringBuilder,多线程使用StringBuffer

二十七、Collections与Collection的区别
Collections是集合的工具类,其中包含大量集合的操作方法,而Collection是集合的顶级接口,

二十八、java 线程状态
1. 新建状态(New):新创建了一个线程对象。
2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5. 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。


二十九、Java多线程中Sleep与Wait的区别
   (1)Thread.sleep()   Object.wait()
   (1)Sleep不释放锁,wait释放锁
   (2)wait和notify需要在同步代码块中调用,而Sleep不用
   (3)sleep需要捕获异常,wait不需要
   
三十、volley应用

三十一、富文本
将字符串解析成html数据块
Spanned spanned = Html.fromHtml(str);
 
三十二、EventBus框架
替代handler实现线程间通信的总线框架,基于订阅发布模式。
包括:订阅者、发布者、事件、总线
EventBus.getDefault().register(this);//订阅事件
EventBus.getDefault().post(object);//发布事件
EventBus.getDefault().unregister(this);//取消订阅

onEventMainThread代表这个方法会在UI线程执行
onEventPostThread代表这个方法会在当前发布事件的线程执行
BackgroundThread这个方法,如果在非UI线程发布的事件,则直接执行,和发布在同一个线程中。如果在UI线程发布的事件,则加入到一个后台的单线程队列中去。

三十三、图片三级缓存
缓存LruCache、文件、网络,依次获取文件。

三十四、MD5加密
不可逆的加密,只能加密不能解密。

三十五、数据缓存
读取网络服务器中的数据,并缓存在本地,下次读取数据时首先获取本地的数据,请求服务器最新的数据,获取成功则覆盖本地数据,失败则显示缓存在本地的数据。
数据存储:
持久化: 本地文件、SQLite、sharedPreference、contentprovider
非持久化:内存

三十六、listView响应监听
listView.setOnItemClickListener()  //item监听
adapter.notifyDataSetChanged()     //数据刷新

三十七、xutil框架


三十八、手机分辨率等级
参照以上方式可将市场上大多数手机划分为5个像素密度等级,分别为:
     ldpi:120dpi,像素密度与dp转换关系为:1dp = 0.75px
     mdpi:160dpi    ,像素密度与dp转换关系为:1dp = 1px
     hdpi:240dpi,像素密度与dp转换关系为:1dp = 1.5px
     xhdpi:320dpi,像素密度与dp转换关系为:1dp = 2px
     xxhdpi:480dpi,像素密度与dp转换关系为:1dp = 3px

三十九、排序时间复杂度
(1)选择排序 O(n^2)
(2)插入排序O(n^2)
(3)冒泡排序O(n^2)
(4)堆排序O(nlogn)
(5)并归排序O(nlogn)
(6)快速排序  最理想O(nlogn) 最差O(n^2)
(7)希尔排序  O(nlogn)最差时间O(n^s) 1<s<2


四十、堆排序
(1)初始化堆,大顶堆或者小顶堆,此处以大顶堆为例
(2)堆调整,从最后一个非叶节点开始调整
(3)排序,将顶节点与最后一个未交换过位置的节点调换
(4)堆调整,从第二个节点开始调整,(3)中已排好序的节点不再调整
参考:http://blog.csdn.net/xiaoxiaoxuewen/article/details/7570621/


四十一、快速排序
    (1)选择一个key,通常为第一个。
(2)从后往前收索将大于key的放在其右边,从前往后收索将小于key的放在其左边,知道前后搜素的下边相等
(3)分别对key前面的数组和后面的数组采用(2)的方法搜索,直到前后数组的长度为1。

四十二、希尔排序
(1)设置增量长度的一半
(2)按增量对数据进行比较
(3)缩小增量为上一次的一半重复(2),直至增量缩小为1
参考:http://www.cnblogs.com/jingmoxukong/p/4303279.html


本文参考:http://blog.csdn.net/u014745194/article/details/51344210















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值