• 前言
  • 正文
  • 结尾

前言

自己刚刚实习的时候,选择的是广电行业的音视频开发岗。当时每个实习生,公司都会安排一个经验丰富的实习导师。平时的工作内容都是自己的实习导师进行安排和验收。

正文

有一天,我们开发小组分到了一个开发安卓盒子的任务,具体的任务内容是要求在安卓盒子上开发一个播放器,能够预览本地的视频画面,同时,将盒子采集的音频和视频数据发送出去。

整个播放器的设计架构大致分为三层,分别是上层的界面层和业务层,中间适配层,底层数据处理层。其中,界面层和业务层完全用Java语言开发,完美兼容了安卓系统。适配层是JNI层,熟悉安卓Native开发的小伙伴肯定对JNI非常了解,我们可以把JNI理解成是Java和C++的转换层。数据处理层就是音视频数据的采集层,主要工作有采集、编码、组包、发送等。

播放器具体的架构模型如下图所示:

前言-LMLPHP

具体到自己的任务是在适配层完成数据转换,同时提供SDK,保证播放器初始化模型为单例模式。于是,自己最先想到了饿汉模式,具体代码可以参考如下:

public class Player {
    private static Player instance = new Player();
    private Player (){}
    public static Player getInstance() {
    	return instance;
    }
}

饿汉单例模式的优点是效率高,类定义的时候就完成了初始化操作,需要的时候可以直接拿过来用,执行效率较高。但是缺点也是非常明显的,不管三七二十一都会创建单例实例,如果程序用不到的话,可能会造成资源浪费。

那我们能不能做到按需分配呢?就是使用的时候再初始化单例对象。答案是肯定的,也就是我们经常说的懒汉单例模式。它都有哪些特点呢?我们通过下面的代码来了解一下。

public class Player {
    private static Player instance;
    private Player (){}
    public static synchronized Player getInstance() {
   	   if (instance == null) {
		   instance = new Player();
           }
    	   return instance;
    }
}

通过上述代码,我们可以发现,懒汉模式是在第一次调用的时候才初始化对象实例,避免了内存浪费。缺点也非常明显,就是第一次调用的时候会比较慢,因为是临时创建的,但是之后就和饿汉模式一样了。

结尾

由于我们使用场景的特点,在播放器实例创建后,基本上一定会被使用到,同时考虑到播放器需要支持快速预览等功能,我们最终采用了饿汉单例模式进行播放器SDK的实现框架模型。

06-29 11:55