Android基础知识(一)

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.可能在造成子类代码的冗余、降低灵活性,因为子类必须拥有父类方法和属性。

你可能感兴趣的:(Android基础知识(一))