Android知识点复习整理

Thread、MessageQueue、Message、Looper、Handler关系及需要注意的地方

  • Android任何一个Thread中都跟着一个Looper,Looper提供了MessageQueue。只要Thread拥有MessageQueue,别的线程就可以往其中添加Message。Looper.prepare(),Looper.loop(),Looper.release(). 如果不想自己实现,可以使用HandlerThread,其中封装了Looper,而不用自己去管理Looper。 Handler sendMessage 将Message 入Queue,Message在入Queue之前,会绑定target到当前handler. 当Looper轮询到该message的时候,会调用message.target.dispatchmessage. 所以在Activity中使用handler 的时候,可能会报警告,因为handler 中如果有使用到activity 的东西,当handler还未被释放的时候,activity将无法被释放,例如网络请求未回来,而页面关闭的时候,activity就可能无法被立即释放掉,而造成内存泄露。解决方法就是将handler中的activity设置为软引用。

Android系统架构

  • Android 系统架构分为四层。Linux内核层、Library Android runtime、Application framework、Application层

  • 底层提供的是Linux内核。 Library Android runtime 使用的是C++ 及 C 编写的。为应用框架层提供服务。如多媒体,浏览器,数据库,图形引擎等的实现都位于这一层。

  • 应用框架层,为应用层提供API 、UI控件 及 一种重要的机制,这种机制提供了可以复用的组件,提供了应用程序的开发规范,屏蔽了应用层与底层交互的复杂性。 包含的主要组件:

1、 View System 提供了一系列的可扩展的UI控件,List、Grid、Button、Web浏览器等等…
2、 Resource Manager 提供了非代码资源的访问接口,如 图片、String、 布局文件等等
3、 Window Manager 管理所有的窗口程序
4、 Content Provider 提供应用程序之间数据共享的接口
5、 Notification Manager 状态栏中显示自定义信息,就是提示信息
6、 Activity Manager 用来管理应用程序生命周期并提供统一的导航回退功能等等。
7、 Package Manager 安卓应用程序安装包管理的接口
8、 Telephone Manager 、 Loaction Manager 等等

  • 应用层 被浓缩为 Activity、 Servince、 Content Provider、 BroadCast 四大组件

内存泄露 和内存溢出

  • 内存溢出 是指软件运行时所需的内存超出了最大内存,内存不足。

  • 内存泄露 是该释放的时候,没有及时释放内存

  • 内存优化:Android中容易内存溢出的部分,就是图片的加载,我们可以使用图片的压缩加上使用LruCache缓存的目的来控制图片所能够使用的内存。 对于比较耗资源的及时释放,如 bitmap、 文件读取、 database 等等。 尽可能少的减免内存泄露。 如我之前说的handler 就有可能造成内存泄露的警告,解决方法就是使用软引用。

我使用的网络请求的发展

  • 使用thread 直接使用 httpClient进行网络请求

  • 使用AsyncTask。 AsyncTask 底层的实现,如 是串行 还是 并行,在不同的版本上是不一样的,其内部也是封装了 Thread 和 handler。 很少用了

  • 使用线程池,设置线程池最高为5个线程同时运行。

  • 弃用HttpClient。 使用Volley、 Retrofit 等等第三方框架。 可以使用HttpUrlConnetion 或者 OKHttp替换 HttpClient。

Android用SharedPreferences保存数据有没有大小限制。

  • 轻量级。 SharedRefrences 保存的数据其实是保存在文件中的(XML),为轻量级,在保存数据的时候,如果数据的量过大,就会导致,commit() 的时间过长,会阻碍主线程,所以 sharedpreferences 更推荐为轻量级的且最好是一次提交,而不是多次提交。(个人猜测…不知道是否正确)

Assets 和 Raw 的相同与区别

  • 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。

  • res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。

  • res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹。

1.读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作

·        InputStream is =getResources().openRawResource(R.id.filename);  

2.读取assets下的文件资源,通过以下方式获取输入流来进行写操作

·        AssetManager am = null;  

·        am = getAssets();  

·        InputStream is = am.open("filename");  

你可能感兴趣的:(实用工具)