一、逻辑实现
1.MediaPlayer
- 概述
- Android多媒体框架支持播放各种常见媒体类型,可以轻松将音频、视频和图片集成到应用当中,可以使用MediaPlayer API,播放存储在应用资源(原始资源)内的媒体文件、文件系统中的独立文件或者通过网络连接获得的数据流中的音频或视频
- 具体使用
- 声明权限
- 获取媒体源:MediaPlayer支持多种不同的媒体源,1.本地资源、2.内部URL:可能从内容解析起中获取的URL、3.外部网址(流式传输)
- 异步准备:由于MediaPlayer可能涉及获取和解码媒体数据会需要很长的执行时间,因此,切勿在应用的界面线程调用,会使界面挂起导致糟糕的用户体验;解决:生成其他线程来准备MediaPlayer,并在准备工作完成后通知主线程
- 管理状态:<img src="https://developer.android.google.cn/images/mediaplayer_state_diagram.gif" alt="M" style="zoom:50%;" />
- 释放MediaPlayer
2.Handler消息机制
-
概述
handler是一套Android消息传递机制,主要用于线程间通信。**handler就是主线程再开了一个子线程,子线程运行并生成Message,Looper获取Message并传递给Handler,Handler逐个获取子线程中的Message
Binder/Socket用于进程间的通信,而Handler消息机制用于同进程之间的线程间通信
可以说只要用异步线程与主线程通信的地方就一定会有handler
在多线程的应用场景中,将工作线程中需要更新UI的操作信息传递到UI主线程,从而实现工作线程对UI的更新处理最终实现异步消息处理
使用Handler消息传递
在app中的使用:主要负责消息的传递和处理,在应用中响应用户对进度条SeekBar的操作
详细知识点可以参考上一篇文章(Handler消息机制)
3.线程通信
-
为什么需要线程通信
- 线程是操作系统调度的最小单位,有自己的栈空间,可以按照既定的代码逐步的执行,但是如果每个线程间都孤立的运行会造成资源的浪费,所以我们需要这些线程间可以按照指定的规则共同完成一件任务,所以这些线程之间就需要互相协调,这个过程被称为线程的通信
- 进程中使用多个线程可以提高软件的运行速度
-
Java中线程通信的方式
-
共享内存:线程之间共享程序的公共状态,线程之间通过读写内存中的公共状态来隐式通信
- volatile:保证内存可见性
- 多个线程访问内存中的同一个被volatile关键字修饰的变量,当线程A修改完该变量后会将最新的值刷新写回主内存,从而保证这个变量被线程B读取使用时是最新值,保证线程之间的透明性,便于线程通信
- 但即使volatile可以保证可见性和顺序性,但无法保证原子性
- volatile:保证内存可见性
-
消息传递:线程之间没有公共的状态,线程之间必须通过明确的发送消息来显示的进行通信
-
wait/notify等待通知信息
- 将处遇等待状态的线程将由其他线程发出通知后重新获取CPU资源,继续执行之前没有执行完的任务,如生产者-消费者模式
- Java实现生产者-消费者模式中的线程通信协作的方式是wait/notify机制
- wait()当前线程释放锁并进入等待(阻塞)状态,notify()唤醒一个等待相应对象锁的线程,使其进入就绪状态,以便在当前线程释放锁后继续竞争锁
-
join方式
- 应用场景,主线程创建并启动子线程之后,如果子线程要进行耗时很长的计算,那么主线程将比子线程先结束,但是主线程需要子线程的执行结果执行下一步,那么此时主线程需要等待子线程,java中提供可join()方法解决问题
- join()方法:在当前线程A调用线程B的join()方法后,会让当前线程A阻塞,直到线程B的逻辑执行完成A才会解除阻塞,然后继续执行自己的业务逻辑,这样做可以节省计算机中的资源
-
-
管道流:输入输出流
- 管道流是一种使用较少的线程间通信,相比于普通文件输入输出流或者网络输入输出流不同之处在于,主要用于线程之间的数据传输,传输的媒介为管道
- 具体实现分为面向字节的和面向字符的
- java的管道输入输出实际上使用的是一个循环缓冲数组来实现的,默认1024,输入流从这个数组中读取数据,输出流从这个数组中写入数据,当这个缓冲数组已满时,输出流所在的线程会被阻塞,当这个缓冲数组为空时,输入流所在的线程会被阻塞
-
-
Android主流的线程通信方式:
-
. 调用Handler类
- Handler类创建之后回开始一直监听是否有消息传递过来,通过在子线程中调用该Handler的消息传递方法sendMessage可以向主线程的Handler的消息监听方法handlerMessage发送消息,实现线程通信
调用Activity类的runOnUtilThread方法
调用View类中的post方法
通过新建一个AsyncTask父类的子类来实现
使用EventBus等工具
-
二、布局
1.RelativeLayout相关布局
- 概述
- 是一种根据父容器和兄弟控件作为参照物来确定控件位置的布局方式
2.Animation
- 帧动画:
- 在xml中设置播放帧动画的图片资源、持续时间、播放属性
- 使用:在xml中通过@anim/自定义文件名引用我们的xml动画资源
- 补间动画
- 有以下几种动画:AlphaAnimation;ScaleAnimation;RoatateAnimation;TranslateAnimation;AnimationSet;
- 使用:在xml定义完动画后,可以在java代码中动态引用xml文件
- 属性动画
- 属性动画是补间动画的延申,主要解决动画点击效果随位置的改变而改变
- 分类:ValueAnimator,ObjectAnimator,TypeEvaluator