Android题目笔记(二)

1.String buffer 与string builder 的区别?

参考:String、StringBuffer与StringBuilder之间区别
三者在执行速度方面的比较:StringBuilder > StringBuffer > String
String:使用最简单,(常量池的概念)
StringBuffer :线程安全的,方法都加了synchronized修饰。
StringBuilder :线程不安全,但是是最快的。

2.如何保证线程安全?

参考:java保证线程安全的两种方式
主内存(Main Memory)和工作内存(Working Memory),内存可见性,synchronized,Lock,volatile。

3.java四种引用

强引用:有引用变量指向时永远不会被垃圾回收,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。
软引用(SoftReference):内存空间足够,垃圾回收器就不会回收它;
弱引用(WeakReference):当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。
虚引用(PhantomReference):为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。要和ReferenceQueue搭配使用。

4.Jni 用过么?

参考:
Android NDK环境配置
Android NDK开发初记
Android NDK开发之《HelloJni》
Java JNI实现原理初探
Android JAVA层加载动态库原理分析
关键点:System.loadLibrary(“xxx”); native;javah
加载大致逻辑:System.loadLibrary(“xxx”)->Runtime.getRuntime.loadLibrary0(libname)->Runtime nativeLoad(name, loader, librarySearchPath)->(c层)dlopen和dlsym函数
dlopen():打开一个动态链接库
dlsym():根据动态链接库操作句柄(pHandle)与符号(symbol),返回符号对应的地址。

5.多进程场景遇见过么?

参考:
Android开发中怎样用多进程、用多进程的好处、多进程的缺陷、解决方法
android开发之AIDL用法_进程间通信原理详解
Android Binder机制(超级详尽)

6.关于handler,在任何地方new handler 都是什么线程下

参考:Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
a.Handler的构造函数可以传入Looper,默认的使用当前线程的Looper,如果当前线程没有Looper,则会报错。MainLooper在程序启动,ActivityThread中就创建了。如果自己开辟线程,可以使用Looper.prepare()创建Looper,然后创建Handler就不会报错了。
b.Handler handler = new Handler(Looper.getMainLooper());这个不管在哪个线程中创建,handleMessage回调的都是主线程。
c.使用默认构造函数创建,当前在哪个线程,handleMessage回调就是在哪个线程。

7.sqlite升级,增加字段的语句

参考:
SQLite添加新的字段
android之存储篇SQLite数据库让你彻底学会SQLite的使用

a.检查表和要增加的字段列是否存在。
b.增加新字段。

/**
 * 方法1:检查某表列是否存在
 * @param db
 * @param tableName 表名
 * @param columnName 列名
 * @return
 */
private static boolean checkColumnExist1(SQLiteDatabase db, String tableName
        , String columnName) {
    boolean result = false ;
    Cursor cursor = null ;
    try{
        //查询一行
        cursor = db.rawQuery( "SELECT * FROM " + tableName + " LIMIT 0", null );
        result = cursor != null && cursor.getColumnIndex(columnName) != -1 ;
    }catch (Exception e){
        LogUtil.logErrorMessage("checkColumnExists1..." + e.getMessage());
    }finally{
        if(null != cursor && !cursor.isClosed()){
            cursor.close() ;
        }
    }

    return result ;
}

// 插入
"ALTER TABLE 'TABLENAME' ADD  'colName' varchar";

8.bitmap recycler 相关

参考:Bitmap.recycle引发的血案
在Android中,Bitmap的存储分为两部分,一部分是Bitmap的数据,一部分是Bitmap的引用。
在Android2.3时代,Bitmap的引用是放在堆中的,而Bitmap的数据部分是放在栈中的,需要用户调用recycle方法手动进行内存回收,而在Android2.3之后,整个Bitmap,包括数据和引用,都放在了堆中,这样,整个Bitmap的回收就全部交给GC了,这个recycle方法就再也不需要使用了。

9.强引用置为null,会不会被回收?

a.如果还存在其他引用,是不会回收的,例如内部类handler的引用。那样可能会造成内存溢出。
b.如果没有其他引用,也不会被立即回收,需要等到gc的时候才会被回收。

10.glide 使用什么缓存?

Glide支持图片的二级缓存(并不是三级缓存,因为从网络加载并不属于缓存),即内存缓存和磁盘缓存。
内存缓存使用lru,从内存缓存中取出来之后,会使用一个WeakReference引用该资源。
生命周期控制:贴了一个fragment。

11.Glide 内存缓存如何控制大小?

Lru算法,设置最大使用内存大小。

参考文章–>https://mp.weixin.qq.com/s/sN_i_IaLUpFBbX9UHIX4NA

你可能感兴趣的:(android)