欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

MS

发布时间:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的这篇文章主要介绍了 MS 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

Handler

  • 谈谈消息机制Handler作用 ?有哪些要素 ?流程是怎样的 ?
    用于线程间通信,要素有handler, message, message queue, looper
    子线程创建handler之前必须创建looper,looper prepare() 会 创建message queue
    new handler时候会绑定到当前Thread中Threadlocal的looper
    looper.loop的时候会开始轮训Meesage队列
    发送消息调用messagequeue.enqueue()调用native方法唤醒让message.next()执行
    取消息for(;;){message.next()}没有消息的话会调用Native方法 让出CPU,如果是主线程的话,
    Activity没有事情做休眠也是可以的
  • 一个线程能否创建多个Handler,Handler跟Looper之间的对应关系 ?
    一个线程可以创建多个handler,每个handler会放入message的target变量里面
    一个looper可以对应多个handler.

  • Handler 引起的内存泄露原因以及最佳解决方案
    匿名内部类会默认持有外部类的引用,所以要是用静态内部类,如果需要引用Actvity context,可以使用weakReference<>
  • 软引用跟弱引用的区别
    软引用在内存不足的时候GC会被清理
    弱引用GC就会清理
  • 为什么系统不建议在子线程访问UI?
    UI空间不支持多线程操作,而且加锁容易造成死锁,使UI逻辑复杂。
    子线程textview.setText("")

    https://baijiahao.baidu.com/s?id=1620358105307361783&wfr=spider&for=pc
  • Looper死循环为什么不会导致应用卡死?
    Looper是保证Activity工作的循环操作,如果Looper退出的话ActivityThread就结束了,Activity的生命周期就是依靠looper来控制的,所以looper死循环不存在的,message.next()会调用native方法判断nativemessagequeue,为空的话让出CPU
  • 使用Handler的postDealy后消息队列会有什么变化?
    会把消息根据时间顺序 插入messagequeue队列
  • 可以在子线程直接new一个Handler吗?怎么做?
    不能,需要创建Looper使用looper.prepare(),或者直接使用handlerThread.
  • Message可以如何创建?哪种效果更好,为什么?
    Message最好使用obtain方法,Obtain会从meesage pool中获取message,减少创建message的开销,这里使用的是享元模式式即:Flyweight,它是对象池的一种实现。享元模式用来尽可能的减少内存的使用量。多用于存在大量重复对象的场景,或需要缓冲池的时候。用来缓存共享的对象。这样来避免内存移除等。
  • Looper能创建多个实例嘛?能自己创建Looper实例嘛?
    每个Thread只有一个Looper实例,保存在ThreadLocal里面
    自己不能new Looper实例,因为Looper构造方法是private的
  • 在子线程创建的handler能与主线程通信嘛?如果能怎么实现。
    在子线程中new handler时候传入主线程looper对象即可与主线程通信
  • handler,asyncTask有什么区别?
    AsyncTask就是对Handler的封装,有四个方法onprepare(主) doinbackground(子线程) onpostprogress(主) oncomplete(主)
  • 线程

  • 线程池的好处? 四种线程池的使用场景,线程池的几个参数的理解?
    控制并发,管理线程(定时,单线程),快速执行减少创建和销毁的开销
    newCachedThreadPool() 最大线程数Integer.MAX_VALUE 任务量大耗时少场景
    newFixedThreadPool(int nThreads) 适用于任务量固定 且运行时间较长的场景 核心线程=最大线程不销毁 超过核心线程的任务阻塞在无界的LinkedBlockingQueue
    ScheduledThreadPoolExecutor(int corePoolSize) 适用于执行定时任务和具体固定周期的重复任务 DelayedWorkQueue
    newSingleThreadExecutor() 按顺序执行 LinkedBlockingQueue
    参数有 核心线程数(一直存在不会销毁) 最大线程数 等待时间(超时销毁) 等待时间单位 线程队列 线程工厂 拒绝策略(抛异常或者抛弃新任务 丢掉老任务)
  • Android中还了解哪些方便线程切换的类?
    handler asynctask intentService Rxjava handlerThread
  • 讲讲AsyncTask的原理
    SerialExecutor(保证顺序执行)+ThreadPool(线程池 执行) +sHandler(主线程looper)
  • IntentService有什么用 ?
    Service+handlerThread onhandleintent执行耗时任务 任务执行完自己关闭service
  • 直接在Activity中创建一个thread跟在service中创建一个thread之间的区别
    主线程创建thread一般是执行短暂的异步任务
    service创建的thread一般是执行长期的任务 如长连接
  • ThreadPoolExecutor的工作策略 ?
    1核心线程没满放入核心线程2队列没满放入队列3线程池没满创建线程池执行
  • Handler、Thread和HandlerThread的差别?
    Handler用于线程间通信,Thread用于开启并运行新线程,HandlerThread自己会创建Handler的Thread
  • ThreadLocal的原理
    threadlocal tl = new ThreadLocal();
    Thread1{ tl.set(123)}
    Thread2{tl.set(234)}
    set的时候调用的是Thread内部的threadLocals.

  • 多线程是否一定会高效(优缺点)
    不一定,主要用于异步操作把耗时任务放到后台,提高用户体验,多用于IO 网络 操作
    缺点是线程太多造成CPU竞争,CPU需要不停切换线程,处理同步问题
  • 多线程中,让你做一个单例,你会怎么做
    懒汉双重检查加同步锁(懒加载)
    饿汉(创建线程前已经建好)
  • 除了notify还有什么方式可以唤醒线程
    还有notifayall(),notify只唤醒一个等待的线程,notifyall唤醒所有等待的线程,然后多个线程通过竞争得到锁
    在生产消费者模式下,如果只唤醒一个进程的话可能
  • 什么是ANR ? 什么情况会出现ANR ?如何避免 ? 在不看代码的情况下如何快速定位出现ANR问题所在 ?
    Activity5秒 broadcast 10秒 service 20秒 不要在主线程做耗时操作
    查看data/anr trace
    情景
    1 binder调用导致anr,如果不需要返回值的话就在AIDL方法参数定义in(c-s)不需要等待返回
    2 主线程等待锁,使用trylock解决
    3 主线程做耗时操作
    4 系统IO文件操作导致ANR,将文件操作放入子线程 ANRManager: 100% TOTAL: 2% user + 2.1% kernel + 95% iowait + 0.1% softirq
    5 JE NE后系统dump信息导致ANR,解决JE NE即可
    6 每个进程只分配15个binder线程,短时间大量binder调用可能导致超出的binder请求得不到处理
    7 mokey可不处理
  • 可重入锁的实现,公平锁非公平锁都是什么定义?
    如果当前线程==获得锁的线程 则可以获取锁 锁count++, 释放一个锁的话count--,如果count ==0的话才释放

    公平和非公平锁的队列都基于锁内部维护的一个双向链表,表结点Node的值就是每一个请求当前锁的线程。
    公平锁则在于每次都是依次从队首取值。
    非公平锁:在等待锁的过程中, 如果有任意新的线程妄图获取锁,都是有很大的几率直接获取到锁的。

  • 说说Android中线程池的实现
    线程池的七个参数为核心线程数,最大线程数,等待时间,等待时间单位,线程队列,线程工厂,拒绝策略
    步骤1执行任务,如果核心线程满 进入队列,如果队列满,新建线程,如果超过最大线程的话 执行拒绝策略
    常见线程池
    固定线程池:核心线程等于最大线程,队列使用无边界的likedBlockQueue,适用于知道线程数,并且时间较长的任务
    缓存线程池:大量耗时较少的任务
    scheduledThreadPool:
    singletonThreadPool:按顺序执行 不需要同步操作 要求顺序执行的任务如数据库操作 文件操作 应用安装
  • 进程线程在操作系统中的实现
    进程是应用的实体,一个应用至少有一个进程
    线程是CPU调度的最小单元,App的主线程就是ActivityThread, 他里面的ApplicationThread是用来和AMS通信的binder.Activity启动后会有主线程和几个binder线程(用于AMS WMS通信)。
  • 安卓线程间通信有哪几种方式
    Handler asynctask rxjava handlerthread intentService
  • 能在子线程创建handler嘛?有什么要注意的吗?
    可以 子线程创建handler需要绑定Looper,绑定子线程looper需要使用looper.prepare() 然后用looper.loop()
    也可以直接使用HandlerThread
  • 说一下为什么要用线程池?线程池的几个参数,以及它是怎么工作的?核心线程数一般有多少?
    线程池可以控制并发,减少新建/销毁线程的开销,可以控制线程执行间隔和执行顺序
    7个参数 核心线程数 最大线程数 超时时间 超时时间单位 线程队列 线程工厂 拒绝策略
    核心线程->队列->线程->拒绝策略
  • Android多线程的实现方式有哪些?
    Thread+runnable, Thread(FutureTask(Callable)), asyncTask,handlerThread,rxjava
  • Android开发中何时使用多进程?使用多进程的好处是什么?
    webView 大图 定位 push 不稳定操作(保护主线程)
    可以使用更多内存,每个进程分配的内存固定,两个进程就可以拿到两倍内存
  • 数据结构与算法

  • 都用过那些常用的数据结构,说说对树的了解?
    链表(遍历使用迭代器效率高) 数组 栈(先进后出) 队列(队尾入队 队首删除这点和栈不同) hashmap
  • 快排写一下,动态规划了解吗?
    sort(start, end)
    {
    int pivor = findPivot(start, end)
    sort(start, pivot-1)
    sort(pivot+1,end)
    }
    findPivot(){
    while(){
    while right--
    while left++
    }
    }
    swap(int a,int b)
  • 冒泡排序的链表实现
  • HashMap如果Hash冲突了怎么解决?
    1.7头插进链表,1.8尾插进链表,长度超过8数组不大于64先扩容
  • 双线程通过线程同步的方式打印12121212…….
  • 快排 堆排 选择排序
  • 二叉树排序方式
  • 二分查找(手写)
  • 10大排序算法
  • Bitmap

  • Bitmap使用需要注意哪些问题 ? public Bitmap.Config inPreferredConfig = Bitmap.Config.ARGB_8888; argb_8888:每个像素占32位,a=8;r=8;g=8;b=8;一共8*4=32位,一个字节8位,共占四个字节; 一张480*800,argb_8888的图片有多大内存:480*800*4/1024=1500kb; jpg图片所占内存大小 = 图片被解析出来后的宽 * 图片被解析出来后的高 * 单位像素颜色模式所占字节数 jpg图片所占内存大小 = (宽 * density / 160) * (高 * density / 160)* 像素模式所占字节数 https://my.oschina.net/u/217380/blog/1486626
  • Bitmap.recycle()会立即回收么?什么时候会回收?如果没有地方使用这个Bitmap,为什么垃圾回收不会直接回收?
  • 一张Bitmap所占内存以及内存占用的计算
    h*w*ARGB_8888(4)
  • Android中缓存更新策略 ?
    LruCache DiskLRUcache
  • LRU的原理 ?
    LinkedHashMap按访问排序,最新最近访问的放在链表尾端。
  • 性能优化

  • 图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理?

    会发生GC 回收内存
  • 内存中如果加载一张500*500的png高清图片.应该是占用多少的内存?
    不考虑缩放的话 500*500*4/1024 = 976Kb
  • WebView的性能优化 ?

    webview首次初始化耗时长,优化打开页面速度,创建全局webview,应用启动就创建webview实例
    H5页面拉取优化,把html,css,js,image等资源预置在客户端本地预置在应用内部提高加载速度
    webview加载图片最慢 可以先加载内容(setBlockNetworkImage(boolean)方法)然后再加载图片:在onPageStarted时屏蔽图片加载,在onPageFinished时开启图片加载。
  • Bitmap如何处理大图,如一张30M的大图,如何预防OOM?
  • 内存回收机制与GC算法(各种算法的优缺点以及应用场景);GC原理时机以及GC对象
  • 内存泄露和内存溢出的区别 ?AS有什么工具可以检测内存泄露?
  • 性能优化,怎么保证应用启动不卡顿? 黑白屏怎么处理?
  • 强引用置为null,会不会被回收?
  • ListView跟RecyclerView的区别?
  • ListView的adapter是什么adapter?
  • LinearLayout、FrameLayout、RelativeLayout性能对比,为什么?
  • Android UI优化
  • Android启动优化
  • 屏幕适配方式
  • apk瘦身技巧
  • webp使用的注意事项
  • 要做一个尽可能流畅的ListView,你平时在工作中如何进行优化的?
  • Android下解决滑动冲突的常见思路是什么?
  • 内存泄露检测有什么好方法?
  • 设计模式

  • 你所知道的设计模式有哪些?
  • 谈谈MVC、MVP和MVVM,好在哪里,不好在哪里 ?
  • 封装p层之后.如果p层数据过大,如何解决?
  • 是否能从Android中举几个例子说说用到了什么设计模式 ?
  • 装饰模式和代理模式有哪些区别 ?
  • 实现单例模式有几种方法 ?懒汉式中双层锁的目的是什么 ?两次判空的目的又是什么 ?
    懒汉 恶汉
    加锁是让多线程访问同步
    两次判空,第一次判空是防止取锁 竞争是是防止排队中的线程创建多个实例
  • 用到的一些开源框架,介绍一个看过源码的,内部实现过程。
  • Fragment如果在Adapter中使用应该如何解耦?
  • 是否了解责任链模式?
  • 说说你对设计模式的理解,开发过程中主要用到了哪些设计模式?
  • 写个单例模式
  • Java

  • 如何理解Java的多态?其中,重载和重写有什么区别?
  • 谈一下JVM内存区域划分?哪部分是线程公有的,哪部分是私有的?
  • final关键字的用法?
  • 死锁是怎么导致的?如何定位死锁
  • 数据库如何进行升级?SQLite增删改查的基础sql语句?
  • Java内存模块分区和GC机制,GC算法有哪些
  • HashMap的实现机制,怎么样HashMap线程安全
  • Finalize机制
  • 强引用 弱引用 软引用 虚引用的区别和使用场景
  • 反射能反射私有方法以及静态方法嘛?
  • Broadcast

  • Broadcast的分类?
  • 广播中怎么进行网络请求
  • Activity

  • Activity启动模式,allowReparent的特点和栈亲和性
  • 异常生命周期
  • 设备横竖屏切换的时候,接下来会发生什么?
  • Activity A启动Activity B,这两个Activity生命周期变化顺序?
  • Service

  • Service的两种启动模式?其生命周期各是什么?
     
  • IntentService与普通Service的区别?
  • Android原理

  • Android中的事件传递机制?
  • ANR出现的情况有几种? 怎么分析解决ANR问题?
  • 内存泄露的场景有哪些?内存泄漏分析工具使用方法?
  • 如何实现启动优化,有什么工具可以使用?
  • Android View绘制流程,当一个TextView的实例调用setText()方法后执行了什么
  • Android dalvik虚拟机和Art虚拟机的优化升级点
  • Android屏幕渲染机制
  • 热修复的原理,你都了解过哪几种热修复框架
  • OkHttp的原理
  • Android 线程池的实现原理
  • 从点击应用图标到进入应用,Android系统都做了哪些工作,期间涉及到的进程切换有哪些?
  • Android事件传递流程和OnTouchListener的关系
  • 双指缩放拖动大图
  • RecyclerView绘制步骤和复用机制
  • Activity遵循什么设计模式
  • EventBus源码解析,遵循什么设计模式
  • 系统的启动流程,从桌面点击图标开始。
  • 自定义view的实现,以及注意事项
  • MVC和MVP的区别,为什么要使用MVP?MVP有什么缺点嘛?
  • 单例有哪几种?单例为什么要双重检查,优点? 那么双重检查就绝对是安全的嘛?
  • 既然双重检查还不是绝对安全的,那么有没有办法完善呢?
  • LRUCache原理
  • Tinker热修复的原理
  • 黄油刀(butterknife)实现原理
  • rxjava是如何实现线程切换的
  • 请介绍下AsyncTask的内部实现,适用的场景是?
  • 如何把一个应用设置为系统应用?
  • 进程间通信

  • 说说你了解的IPC方法
  • 说说Binder的大体实现
  • 怎么控制另外一个进程的View显示
  • Android中进程间通信有哪些实现方式?
  • 网络

  • HTTPS是怎么实现的?
  • 客户端网络安全实现
  • 对服务器众多错误码的处理(错误码有好几万个)
  • HTTPS的组成是什么?
  • tcp,udp的区别
  • 为什么要三次握手
  • tcp包过大怎么办?
  • 网络传输你们是怎么加密的?
  • 实际问题

  • Android应用保活
  • RemoteViews实现和使用场景
  • LeakCanary的使用和实现原理
  • 介绍一下你在开发过程中使用到的设计模式
  • ClassLoader的双亲委托
  • Android中的ClassLoader
  • 各大图片框架之间的区别,如果让你自己实现,怎么实现?
  • kotlin有什么优点,或者说你在使用它之前做了什么考虑?
  • 如何实现一个bug统计框架(如bugly,友盟)
  • 混淆的注意事项(反射不能混淆等),第三方框架能混淆嘛?
  • 断点续传实现原理。怎么从断点处继续下载?下载完怎么确保文件是正确的?
  • 基础

  • 安卓的动画有哪几类,有什么区别
  • 多个进程,会创建几个application实例?
  • anr怎么定位
  • https://www.jianshu.com/p/ca2ecc3ea0f0

    https://www.jianshu.com/p/81a17da4d695

    作者:秀叶寒冬
    链接:https://www.jianshu.com/p/c8dd2cb55b81
    来源:简书

    总结

    以上是生活随笔为你收集整理的MS的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。