1、内存溢出和内存泄露有什么区别
内存溢出:应用的内存已经已经达到系统设置的最大值,进而导致崩溃
内存泄露:应用使用资源之后没有及时释放,导致应用内存中持有了不需要的资源,通常都是由于内存泄露导致内存溢出。
2、wait()和sleep()的区别
①这两个方法来自不同的类分别是Object和Thread
②sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
③wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
④sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法
3、ListView的优化方案
①重用 convertView
②用 ViewHolder 避免在 getView 中有 重复调用的 findViewById
③设置 View (如 TextView#setText )之前先对比数据是否有改变(重绘代价大)
④避免在 getView 函数中直接加载 Image 或做其他比较耗时的操作
⑤ListView 中元素避免半透明(半透明绘制需要大量乘法计算)
⑥尽量开启硬件加速
⑦ 用威力加强版 RecyclerView代替ListView
4、注册广播有几种方式,这些方式有何优缺点
①在应用程序的代码中注册
当BroadcastReceiver更新UI,通常会使用这样的方法注册。启动Activity时候注册BroadcastReceiver,Activity不可见时候,取消注册。
②在AndroidManifest.xml当中注册,是常驻型广播,程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。缺点是广播始终处于活动状态,对cpu和电量耗费相对较高。
5、线程的几种状态,分别是哪些
java中,线程通常有五种状态,创建,就绪,运行、阻塞和死亡状态。
①创建:生成线程对象,并没有调用该对象的start方法线程就会被创建
②就绪:调用start创建后线程就会处于就绪状态,或者线程从等待或者睡眠中回来之后,也会处于就绪状态
③运行:线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码
④阻塞:线程正在运行的时候被暂停,sleep,suspend,wait等方法都可以导致线程阻塞。
⑤死亡:线程的run方法执行结束或者调用stop方法后该线程就会死亡
6、什么是ANR如何避免它?
Application Not Responding也就是在规定的时间内,没有响应。
原因:
①在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)
②BroadcastReceiver在10秒内没有执行完毕。
避免方法:
①在Activity的onCreate()和onResume()减少耗时操作
②将耗时任务放到非UI线程执行然后用handler来更新UI线程
③避免在onReceiver里面做过多操作
④避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。
7、如果后台的Activity由于某种原因被系统回收了,如何在被系统后手之前保存当前状态
①Activity中提供了一个方法:onSavedInstanceState(Bundle bundle),当系统销毁一个Activity时,会将Activity的状态信息已键值对形式存放在bundle对象中
②当系统重新回到被回收的Activity时会调用这个Activity的onCreate方法,并把bundle对象传递过去
8、线程间通讯的两种方式是什么及原理?
Android线程间通信主要指UI线程与子线程间的通信。Android线程间通信的方式主要有两种,一种是通过MessageQueue机制实现通信;一种是使用异步任务AsyncTask。
①Message Queue是一个消息队列,用来存放通过Handler发布的消息。Android在第一启动程序时会默认会为UI thread创建一个关联的消息队列,可以在自己的子线程中创建Handler与UI thread通讯
② AsyncTask:首先继承一下此类,实现以下若干方法
onPreExecute(),doInBackground(Params…),onProgressUpdate(Progress…),onPostExecute(Result)
9、final,finally,finalize的区别
①final—修饰符(关键字)。如果一个类被声明为final,将不能作为父类被继承。将变量或方法声明为final,可以保证它们在使用中不被改变。将方法被声明为final后不能重载。
②finally—在异常处理时提供 finally 块来执行任何清除操作。
③finalize—方法名。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
10、Android中asset文件夹和raw文件夹的区别
①资源映射:res/raw中的文件会被映射到R.Java文件中,assets中的文件不会被映射。
②目录结构:res/raw不可以有目录结构,而assets则可以有目录结构(可以再建其他文件夹)
③目录用途:res/raw一般存放一些音视频文件,assets一般存放html,js,css和数据文件
④访问方式:
res/raw访问使用R.id.filename
InputStream in = context.getResources().openRawResource(R.id.filename);
assets访问方式
InputStream in = context.getResources().getAssets().open(fileName);
11、Android内存的优化策略
①使用更加轻量的数据结构
②避免在Android里面使用Enum
③减小Bitmap对象的内存占用
④Bitmap对象的复用
⑤使用更小的图片
⑥使用StringBuilder来代替频繁的字符串拼接
⑦避免在onDraw方法里面执行对象的创建
⑧避免对象的内存泄露
12.继承的优缺点 :
优点:
1.代码重用,减少创建类的成本,每个字类都拥有父类的方法和属性;、
2.子类与父类基本相似,但又与父类有所区别
3.提高代码的可扩展性
缺点:
1.继承是可侵入性的,只要继承就必须拥有父类所有属性和方法
2.可能在造成子类代码的冗余、降低灵活性,因为子类必须拥有父类方法和属性。