知识点总结

1、方法数大于65536,用multidex分包解决

2、线程和进程的区别

3、数据持久化就是将内存的数据保存到外存

4、 1)、线程间通信机制
首先,looper、handler、messagequeue三者共同实现了android系统里线程间通信机制。如在A、B两个子线程之间需要传递消息,首先给每个子线程绑定一套handler、l ooper、messagequeue机制,然后这三个对象都与其所属线程对应。然后A线程通过调用B线程的Handler对象,发送消息。这个消息会被Handler发送到B线程的 messagequeue中,而属于B线程的Looper对象一直在for循环里无限遍历MessageQueue, 一旦发现该消息队列里收到了新的消息,就会去对消息进行处理,处理过程中会 回调自身Handler的heandleMessage方法。从而实现了不同线程间通信。


2)、Looper实现原理
Looper类里包含一个消息队列对象和一个线程对象。当创建Looper时,会自动创建一个消息队列,同时将内部线程对象指向创建 Looper的线程。当开启Looper后           (looper.loop()),会自动进入无限for循环中,不断去遍历消息队列,如果没有消息则阻塞,有消息则回调handler的handlemessage方法进行处理。


3、Looper.prepare()
首先,要使用Looper机制一般会在当前线程中创建Handler对象,里面会自动创建一个looper对象和消息队列,这里面的消息队列属于当前线程空间。但此时的looper还不 会去遍历,也没有绑定到当前线程。其中,looper对象内部也包含一个空消息队列对象和空线程。通过Looper.prepare()方法,先让该消息队列指向当前线程的消息队列, 让空线程也指向当前线程。从而实现了绑定。


4、HandlerThread 
事实上Android提供了一个封装好的带有looper的线程类,即为HandlerThread
Handler机制的分发中心就在Looper中的loop(),HandlerThread将loop转到子线程中处理,降低了主线程的压力,使主界面更流畅 
其实 说白了,创建HandlerThread,只是为了用此线程的looper  最终的runnable都还是post到主线程运行(已用Toast测试过) 
最终的最终就是降低了Loop中的loop功耗,依旧在主线程中运行。

5、==比较的是内存地址,equals比较串是否相同,hashcode就像是索引

6、java垃圾回收机制 (互相引用是会被回收的)

  当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾回收也可以清除内存记录碎片。由于创建对象 和垃圾回收器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的 内存分配给新的对象。

用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。
需要注意的是:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身


需要注意的是,调用System.gc()也仅仅是一个请求(建议)。JVM接受这个消息后,并不是立即做垃圾回收,而只是对几个垃圾回收算法做了加权,使垃圾回收操作容易发 生,或提早发生,或回收较多而已。

7、减少GC开销的措施

(1)不要显式调用System.gc()
(2)尽量减少临时对象的使用
    (3)对象不用时最好显式置为Null
    (4)尽量使用StringBuffer,而不用String来累加字符串
    (5)能用基本类型如Int,Long,就不用Integer,Long对象
    (6)尽量少用静态对象变量,静态变量属于全局变量,不会被GC回收,它们会一直占用内存。
        (7)分散对象创建或删除的时间

8、因为需要定义一些共通的东西来进行交流,TCP/IP就是为此而生。TCP/IP不是一个协议,而是一个协议族的统称。里面包括了IP协议,IMCP协议,TCP协议,以及我们更 加熟悉的http、ftp、pop3协议等等。电脑有了这些,就好像学会了外语一样,就可以和其他的计算机终端做自由的交流了。

9、阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪)

10、在Android中实现异步任务机制有两种方式,Handler和AsyncTask
Activity.runOnUiThread(Runnable)
View.post(Runnable),View.postDelay(Runnable,long)
Handler
AsyncTask

11、invalidate()得在UI线程中被调动,在工作者线程中可以通过Handler来通知UI线程进行界面更新。
而postInvalidate()在工作者线程中被调用

12、Collection接口,集合结构总的父接口,有两个子接口list和set
       List接口 元素有序可重复.
       Set 接口 元素无序不可重复

13、JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返
回结果的多线程

14、android中常用设计模式

1). Application 单例模式   开房睡完觉出去办事,回来不需要重新开一间房
2).观察者模式 各种listener     
什么是观察者模式?一般提到原告,必然脑子立刻联想到被告,观察者和被观察者就如同原告和被告总是那么成对出现。观察者模式,又被叫做订阅模式,有订阅者和发布 者。当下IPHONE6异常火爆,国内粉丝要想购买,那必须得预定,必须到它苹果官方去预定,填一大堆资料,交不交钱我不知道,反正得预定登记。等粉丝等到两眼欲 穿、花儿快谢了时候,它粉墨登场了,官方以高姿态从容向预定过的粉丝发售。这苹果就是被观察者,粉丝就是观察者,观察者和被观察者之间需要建立联系,那就是登 记。登记过后,被观察者拿捏火候觉得时机成熟的时候,就以权位者姿态向观察者抛出绣球,观察者迫不及待的伸出双手牢牢抓住后,满心欢喜的赞美苹果的伟大和自己的 庆幸。睁大眼睛盯着目标看,期待期望结果,这就是观察者模式。
3). MVC 这个好理解
4). 响应链模式 触摸、按键等各种事件的传递
5).工厂模式
工厂模式的应用非常广泛,比如android的bitmap中常用的BitmapFactory类,创建Bitmap对象,通常使用静态工厂方法。凡是出现了大量的产品需要创建,并且具有共同 的接口时,可以通过工厂方法模式进行创建。但是这些方法针对不同的数据进行了不同的操作。 工厂类可以根据条件生成不同的子类实例。

6)、代理模式  字面理解就是自己不方便做或者不能做的事情,需要第三方代替来做,最终通过第三方来达到自己想要的目的或效果。
7)、适配器模式: Adapter 为ListView GridView等添加数据

15、退出activity
     1)、终止当前正在运行的Java虚拟机,导致程序终止System.exit(0);
     2)、使用killProcess()函数,首先获取当前进程的id,然后杀死该进程
     3)、finish()

16、第一种静态方式:在清单文件中通过<receive>标签声明
第二种代码动态方式:
静态注册的程序,无论该程序是否启动,都会当广播到来时接收,并处理。而动态注册的程序只有在程序运行时才会收到广播消息,程序不运行了,它就收不到了。

17、activity在屏幕旋转时的生命周期
不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;设置Activity的 android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次;设置Activity的 android:configChanges="orientation|keyboardHidden"时(在API13及以上,也就是3.2以上时,需要orientation|keyboardHidden|screensize才能保证不重新创建 activity),切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

18、final修饰类、方法、属性!不能修饰抽象类,因为抽象类一般都是需要被继承的,final修饰后就不能继承了。

final修饰的方法不能被重写而不是重载! 
final也不能修饰接口,接口可以只能被public&abstract修饰

19、java引用:
1.1、强引用
当我们使用new 这个关键字创建对象时被创建的对象就是强引用,如Object object = new Object() 这个Object()就是一个强引用了,如果一个对象具有强引用。垃圾回收器 就不会去回收有强引用的对象。如当jvm内存不足时,具备强引用的对象,虚拟机宁可会报内存空间不足的异常来终止程序,也不会靠垃圾回收器去回收该对象来解决内 存。
1.2、软引用
如果一个对象具备软引用,如果内存空间足够,那么垃圾回收器就不会回收它,如果内存空间不足了,就会回收该对象。当然没有被回收之前,该对象依然可以被程序调 用。
1.3、弱引用
如果一个对象只具有弱引用,只要垃圾回收器在自己的内存空间中线程检测到了,就会立即被回收,对应内存也会被释放掉。相比软引用弱引用的生命周期要比软引用短很 多。不过,如果垃圾回收器是一个优先级很低的线程,也不一定会很快就会释放掉软引用的内存。
1.4、虚引用
如果一个对象只具有虚引用,那么它就和没有任何引用一样,随时会被jvm当作垃圾进行回收。 

20、res/raw和assets的相同点:
两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。

21、尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,
因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。
因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source,
  decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,
无需再使用java层的createBitmap,从而节省了java层的空间。

22、Fragment与Activity 的交互
例如静态变量,静态方法,持久化,application全局变量,收发广播,handler
private是访问权限限定,static表示不要实例化就可以使用

23、requestLayout 当view确定自身已不再适合现有区域时,该view本身调用这个方法要求parent view重新调用他的onMeasure、onLayout来重新设置自己的位置。

24、当你关注一个事物的本质的时候用抽象类

当你关注一个操作的时候用接口

25、四大组件在UI线程中执行

android为了提高交互的速度和效率,四大组件,都是在主线程中回调。如果放在子线程中,会导致刷新很卡,无法更好地响应用户的操作

26、内存优化

1)循环中不使用局部变量

2)不用的对象指为null

3)  数据库游标及时关闭

4)contentView缓存

5)unregisterReceiver()

6)关闭in(out)putStream

7)图片压缩(decodeStream创建bitmap),recycle回收

8)尽量避免static资源浪费

27、mvc模式

m 处理数据、业务流程

v 显示结果(xml)

c 桥梁的作用(activity交互)

将业务逻辑和显示界面分离:

1)耦合性低

2)可扩展性好

3)模块职责划分明确

28、应用层 FTP/HTTP

传输层 TCP/UDP

网络层 IP

29、三级缓存:内存-文件-网络

四种启动模式:standard、singleTop、singleTask、singleInstance

五种存储方式:sharePreference、SQLite、File、ContentProvider、网络存储

30、跨进程通信的四种方式:

1)activity

2)contentProvider

3)BroadCastReceiver

4)AIDL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值