2020年Android面试常考知识点汇总,音视频开发书籍

js和java对象交互

  1. 获取webview控件的websetting

  2. 设置websetting.setJavascriptEnabled( true )

  3. 将一个对象暴露给JavaScript:webview.addJavascriptInterface。这个对象包含了JS调用的方法,这些方法用@JavascriptInterface修饰

  4. JS通过这些方法与Android交互

防止OOM

  1. 在代码中动态地将webview设置到布局中,而不是直接写到xml文件中;
  2. 在Activity的onDestory中销毁webview

线程相关

Linux线程基础

  • 线程与进程的区别
  • 线程同步
  • Linux线程通讯方式

ANR

  • what
  • Activity 5s内无响应,BroadcastReceiver 10s内无响应
  • /data/anr/traces.txt 文件记录了ANR的信息
  • why
  • how

耗时任务或者线程间通讯

  • AsyncTask

  • 本质上是对 ThreadPool 和 Handler 的一个封装

  • 默认是串行的执行任务,可以调用executeOnExecutors()方法并行执行任务

  • Handler

  • IntentService

Handler

  • Handler + MessageQueue + Looper

MessageQueue本质上是一个单链表,不是Queue。采用FIFO方式管理,enqueueMessage()方法是将消息插入一条队列,next()方法是一个无限循环的方法。如果有消息,则取出,如果没有,就阻塞

  • HandlerThread

本质上是一个继承了Thread的线程类
通过创建HandlerThread获取looper对象,传递给Handler对象,执行异步任务。在HandlerThread中通过**Looper.prepare()来创建消息队列,并通过Looper.loop()**来开启消息循环。创建HandlerThread后必须先调用start()方法,才能调用getLooper()获取Looper对象。

HandlerThread封装了Looper对象,使我们不用关心Looper的开启和释放的细节问题。如果不用HandlerThread的话,需要手动去调用Looper.prepare()和Looper.loop()这些方法。

AIDL

  • 使用流程:以Activity(进程1)和Service(进程2)通信为例

  • 创建AIDL接口,Build一下,产生相关代码

  • 创建IBinder实例,即实例化xxx.Stub()抽象内部类,override抽象方法

  • 创建Service,在onBind()中,把上述IBinder实例返回

  • 在Activity中调用bindService启动Service,然后在ServiceConnection中的onServiceConnected方法回调中获得该IBinder实例。

  • Activity调用该实例的方法,实现通信

Messager

  • 一种轻量级的跨进程通讯方案,底层使用AIDL实现。

  • 是一种串行的通信,即服务端需要一个一个处理消息。因此,在大量并发请求的情况下,用Messager


    响应式编程

    RxJava/RxAndroid

    基于观察者模式,可以方便地以流的方式处理异步事件

    1. 创建:
      Observable.create/just/from

    2. Schedulers线程调度

    • 在不指定线程的情况下, RxJava 遵循的是线程不变的原则

    • subscribeOn():

    • 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。

    • subscribeOn() 的位置放在哪里都可以,但它是只能调用一次的。

    • observeOn():

    • Subscriber 所运行在的线程,或者叫做事件消费的线程。

    • 指定的是它之后的操作所在的线程,以此实现线程的多次调用

    • 举例:

    基于观察者模式,可以方便地以流的方式处理异步事件

    1. 创建:
      Observable.create/just/from

    2. Schedulers线程调度

    • 在不指定线程的情况下, RxJava 遵循的是线程不变的原则

    • subscribeOn():

    • 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。

    • subscribeOn() 的位置放在哪里都可以,但它是只能调用一次的。

    • observeOn():

    • Subscriber 所运行在的线程,或者叫做事件消费的线程。

    • 指定的是它之后的操作所在的线程,以此实现线程的多次调用

    • 举例:

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年1月26日
下一篇 2022年1月26日

相关推荐