总结1

作者: 悠悠我心_4a00 | 来源:发表于2018-07-31 16:05 被阅读0次

    1.为什么子线程不能访问更新Ui
    在onCreate方法中创建了子线程并访问UI,没有崩溃,因为ViewRootImpl还没有创建的,无法检测当前线程是否是UI线程。正常情况子线程会在很短的延时操作后ViewRootImpl已经创建了,可以执行checkThread方法检查当前线程。如果是非UI线程则会抛出异常  


    2.View的绘制原理

    View的绘制原理 - CSDN博客


    3.Android 强引用,弱引用,软引用,虚引用

    1.  强引用

    以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。

    2.软引用(SoftReference)

    如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。

    3.弱引用(WeakReference)

    如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。

    4. 虚引用

    用的比较少,就不管它了


    5.AIDL

    AIDL:Android Interface Definition Language,即Android接口定义语言。 Android 使用AIDL提供公开服务接口,使得不同进程间可以相互通信。 建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下: (1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。 (2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。 (3)建立一个服务类(Service的子类)。 (4)实现由aidl文件生成的Java接口。 (5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。


    6,进程

    前台进程(foreground process):需要用户当前正在进行的操作。一般满足以下条件:

    屏幕顶层运行Activity(处于onResume()状态),用户正与之交互 

    有BroadcastReceiver正在执行代码 

    有Service在其回调方法(onCreate()、onStart()、onDestroy())中正在执行代码

    这种进程较少,一般来作为最后的手段来回收内存

    可视进程(visible process):做用户当前意识到的工作。一般满足以下条件:

    屏幕上显示Activity,但不可操作(处于onPause()状态) 

    有service通过调用Service.startForeground(),作为一个前台服务运行 

    含有用户意识到的特定的服务,如动态壁纸、输入法等

    这些进程很重要,一般不会杀死,除非这样做可以使得所有前台进程存活。

    服务进程(service process):含有以startService()方法启动的service。虽然该进程用户不直接可见,但是它们一般做一些用户关注的事情(如数据的上传与下载)。

    这些进程一般不会杀死,除非系统内存不足以保持前台进程和可视进程的运行。

    对于长时间运行的service(如30分钟以上),系统会考虑将之降级为缓存进程,避免长时间运行导致内存泄漏或其他问题,占用过多RAM以至于系统无法分配充足资源给缓存进程。

    缓存/后台进程(cached/background process):一般来说包含以下条件:

    包含多个Activity实例,但是都不可见(处于onStop()且已返回)。

    系统如有内存需要,可随意杀死。


    7.注册广播

    一种是在Activity代码块中使用registerRceiver注册

    一种是在Mainifest中注册


    8.Toast

    在Android源码中的NotificationManagerService.java这个类中定义了两个静态变量,分别对应Toast.LENGTH_LONG(3.5秒)和Toast.LENGTH_SHORT(2秒)的值


    9.Intent可以传递哪些类型的数据

    1. 8种基本数据类型及其数组byte   boolean char short int long double float

    2. String(String实现了Serializable)/CharSequence实例类型的数据及其数组

    3. 实现了Parcelable的对象及其数组

    4. 实现了Serializable的对象及其数组


    10.数据库管理

    getReadableDatabase()和getWriteableDatabase()都可以得到一个可既可以读又可以写的数据库对象,不同的是,当磁盘空间满了之后,getReadableDatabase()得到的是一个只读的对象,而getWriteableDatabase()则会抛出异常。(getReadableDatabase()方法中会调用getWritableDatabase()方法)


    11.NDK

    NDK是一系列工具的集合,NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java 应用打成apk包。

    NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需简单的修改mk文件就可以创建出so。

    NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。


    12.SimpleAdapter

    使用SimpleAdapter作为适配器是,会按照如下顺序判断View:

    1、该view是否实现checkable接口

    2、该view是否是TextView

    3、该view是否是ImageView

    如果以上三种类型都不是,就会抛出IllegalStateExeception


    13.GLSurfaceView

    GLSurfaceView是SurfaceView的一个实现。它用一个专门的surface去显示OpenGL渲染的图像。

    1>管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。

    2> 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。

    3> 用户自定义渲染器(render)。

    4> 让渲染器在独立的线程里运作,和UI线程分离。

    5> 支持按需渲染(on-demand)和连续渲染(continuous)。

    6> 一些可选工具,如调试。


    14.


    相关文章

      网友评论

          本文标题:总结1

          本文链接:https://www.haomeiwen.com/subject/dudhvftx.html