Android实现音乐播放进度条传递信息的两种方式(在service和activity中)
实现播放时的进度条显示,或是定时从service获取某些信息,是我们日常开发中经常遇到的需求,下面介绍当音乐再service中运行时,activity如果获取音乐进度信息的两种方式:
一、在activity中建立消息接收机制
我们需要在activity中建立一个用于接收信息的handler(handler简单的说是在android中可以发送消息和也可以处理消息的一种机制,当然它的用途更加强大,有时间可以去自己了解)
我们需要在onCreate方法之前添加handler,这样才能保证当我们的activity被destroy之后,再重建时可以第一时间获取当前音乐的进度。
下面是代码,有的同学可能看出来了,这个Handler的handleMessage被重写了,handleMessage写在了new Handler.Callback()回调函数中,返回值变成了boolean,其实这样做是为了防止内存泄漏,当然如果你能忍受Android Studio那一坨巨大的黄色警告你也可以选择用原本的handler方法,
//当前音乐播放进度
private static TextView nowTime;
//音乐进度条
static SeekBar songseek;
//运用Handler中的handleMessage方法接收service传递的音乐播放进度信息
public static Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
// super.handleMessage(msg);
// 将SeekBar位置设置到当前播放位置,
// msg.arg1是service传过来的音乐播放进度信息,将其设置为进度条进度
songseek.setProgress(msg.arg1);
//将进度时间其转为mm:ss时间格式
nowTime.setText(new SimpleDateFormat("mm:ss",Locale.getDefault()).format(new Date(msg.arg1)));
return false;
}
});
//下面才是android的onCreate方法
protected void onCreate(Bundle savedInstanceState) {
......
}
二、在service中建立一个定时器来定时发送音乐进度信息
//开始播放音乐
mediaPlayer.start();
//每隔50毫秒发送音乐进度
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
//实例化一个Message对象
Message msg = Message.obtain();
//Message对象的arg1参数携带音乐当前播放进度信息,类型是int
msg.arg1 = mediaPlayer.getCurrentPosition();
//使用MainActivity中的handler发送信息
MainActivity.handler.sendMessage(msg);
}
}, 0, 50);
当然你也可以使用线程的方式来发现音乐进度信息,不过在这里并不推荐,因为单纯的音乐播放进度信息而已,没有必要用到线程来传信息,而已每一次执行都会创建一个线程,这样很浪费资源
//创建一个线程每隔100毫秒发送一次信息
Runnable runnable = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg = Message.obtain();
msg.arg1 = mediaPlayer.getCurrentPosition();
MainActivity.handler.sendMessage(msg);
}
}
};
Thread musicThread = new Thread(runnable);
musicThread.start();
附:MediaPlayer做音乐播放器采坑以及解决办法1.千万不要把mediaPlayer.getDuration()放在定时任务里,线程和定时器都不能放
因为mediaPlayer.prepare()的执行速度很低,有概率出现mediaPlayer.prepare()还在执行中,突然定时器里刚刚好到时间该调用mediaPlayer.getDuration()这个方法,结果就是mediaPlayer.prepare()因为没有初始化成功就调用mediaPlayer.getDuration()而报下面的错误导致程序闪退。
java.lang.IllegalStateException android.media.MediaPlayer._prepare(Native Method)
(当然如果你的定时操作间隔越大出错的概率就越小,不过我强迫症就是忍不了)
2.上面提到mediaPlayer.prepare()的执行速度很低,如何解决
使用mediaPlayer.prepare()时,正常操作是:
mediaPlayer.prepare();
mediaPlayer.start();
建议使用 mediaPlayer.prepareAsync()来代替mediaPlayer.prepare(),下面的代码可以取代上面
mediaPlayer.prepareAsync();
//需要设置一个监听器
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
看一下效果
Android作业 音乐播放器
总结
到此这篇关于Android实现音乐播放进度条传递信息的两种方式(在service和activity中)的文章就介绍到这了,更多相关android 实现音乐播放进度条内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!
- Spark Streaming自定义Receivers
- 利用USB橡皮鸭在目标机器上启动Empire或Meterpreter会话
- Spark部署
- Spark调优
- perl语言十分钟入门【零基础可入】
- Spark硬件配置推荐
- Spark作业调度
- 如何把Photoshop改造成远程控制工具(RAT)来利用
- Office高级威胁漏洞在野利用分析
- 10行代码告诉你,为什么说Python数据可视化是一件艺术品
- 没想到你是这样的Linux | 终端下有趣的命令合集
- PhEmail:基于Python的开源网络钓鱼测试工具
- 数据库中间件mysql-proxy细节【mysql官方的中间件】
- Office CVE-2017-8570远程代码执行漏洞复现
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Pinpoint 一款强大的APM工具
- 1. Pandas系列 - 基本数据结构
- 6 年前,只会 JSP 和 Servlet 就可以找到工作
- Python文件处理实用指南
- 2. Pandas系列 - Series基本功能
- 1.3 广告算法专题 - 交叉验证
- 最好用的内网穿透工具合集
- JVM垃圾回收之垃圾回收器,程序员必须掌握的知识
- 5分钟Flink - 时间与语义案例详解
- 5分钟Flink - 时间语义和Watermark
- 3. Pandas系列 - DataFrame操作
- 4. Pandas系列 - 基本功能和统计操作
- 面经手册 · 第8篇《LinkedList插入速度比ArrayList快?你确定吗?》
- 无所不能的Embedding 2. FastText词向量&文本分类
- 5. Pandas系列 - 重建索引