一、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
(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