实验目的
- 学会使用MediaPlayer
- 学习RxJava,使用RxJava更新UI
- 学会使用Service进行后台工作
- 学会使用Service与Activity进行通信
效果

RxJava简介
GitHub地址:
ReactiveX团队
RxJava
RxAndroid
RxJava是主体,其实还有RxAndroid、RxGo、RxPY、RxSwift等适配
这里使用的是RxAndroid和RxJava
RxAndroid并不包括全部的RxJava,而是侧重Android的特性进行添加,所以防止缺少依赖库,还是都得使用
其它代码环境
这里使用的是Android手机应用开发(八) | 制作简单音乐播放器 的大部分代码
只是将更新UI的操作从Handler更改为RxJava
注册服务AndroidManifest.xml
1 |
|
新建服务MusicService.java
1 | package wang.janking.mymusic; |
布局文件 activity_main.xml
1 |
|
代码文件
1 | package wang.janking.mymusic; |
添加依赖
有两种办法
直接在
Build.gradle(Module app)里添加1
2
3//这是截止到目前的最新版
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.4'下载
Jar包手动添加依赖这个我试过,但是从一些小网站上下载的缺少很多东西,而且很多jar包在CSDN上下载要积分!!!知识怎么能收费呢!
但是直接添加依赖代码的方法可能会出现下载失败的情况,因为要经过谷歌的库……
这样子需要更改Build.gradle(Module Project)
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. |
添加被观察者(Observable)
现在新的版本不是简单添加一个Observable就好,而是需要寄放在CompositeDisposable里面
所以在MainActivity.java中添加两个成员变量
1 | //RxJAVA变量 |
这里其实做的主要操作就是每隔一毫秒读取歌曲的进度,然后调用onNext()让观察者更新UI,如果歌曲已经停止就调用onComplete()结束观察过程
因为我想实现歌曲播放完毕自动回到起点,同时UI置位,所以这里用了很多变量(如,
isFinish,isStop等)但是我知道这些变量有冗余,没有精简,但是功能是没问题的!
添加观察者(DisposableObserver)
现在的版本不是叫Observer了,而是加了个Disposable,表示可处理,就把它当做对事件的具体处理来理解就好了
更改MainActivity.java播放按钮的监听事件
1 | //观察者 |
为什么这个观察者变量不像被观察者一样作为一个成员变量呢?
因为它们只能订阅一次!
这里是每次点击播放按钮就开始播放,并且开始监听UI改变,然后歌曲播放完毕(或者点击停止按钮)就调用onComplete()方法,那么这对观察者和被观察者的生命也就终止了……
但是重新播放或者选择新的歌曲的话会报错
1 | 12-03 19:59:08.238 28919-28919/wang.janking.mymusic E/AndroidRuntime: FATAL EXCEPTION: main |
所以要在每次需要监听给的时候动态创建一个局部变量disposableObserver
以后再调用的时候就又是一个新的变量了
销毁
如果Activity要被销毁时,我们的后台任务没有执行完,那么就会导致Activity不能正常回收,而对于每一个Observer,都会有一个Disposable对象用于管理,而RxJava提供了一个CompositeDisposable类用于管理这些Disposable,我们只需要将其将入到该集合当中,在Activity的onDestroy方法中,调用它的clear方法,就能避免内存泄漏的发生。
修改onDestroy方法
1 |
|