我试图简单/清楚地解释播放音乐的要求,显示时间过去/剩余的mp3细节,以及使用搜索栏进行擦洗。
活动托管片段。服务有MediaPlayer。
片段同时启动服务并显示对话框。
对话框按钮控制MediaPlayer。我可以使用对话框中的av控件暂停/播放。
当我尝试使用info设置对话框视图时发生NullPointerException。似乎问题在于对话框没有足够快的速度来附加媒体播放器详细信息并设置搜索栏进度。
我最初并没有使用某项服务,但这种方法并不能满足其他要求,例如旋转时无缝音频和播放音频,即使对话被用户关闭也是如此。
Project source available on GitHub.
更新#1。添加堆栈跟踪。在PreviewDialog.java:112发生崩溃。为了观察NPE,我在链接的仓库中注释了该行,并注释了取消注释。
0-07 14:35:09.475 12202-12202/com.es0329.workshop E/MediaPlayer-JNI: QCMediaPlayer mediaplayer NOT present
10-07 14:35:09.495 12202-12202/com.es0329.workshop E/MediaPlayer: Should have subtitle controller already set
10-07 14:35:09.500 12202-12202/com.es0329.workshop E/MediaPlayer: Should have subtitle controller already set
10-07 14:35:09.502 12202-12202/com.es0329.workshop E/AndroidRuntime: FATAL EXCEPTION: main
10-07 14:35:09.502 12202-12202/com.es0329.workshop E/AndroidRuntime: Process: com.es0329.workshop, PID: 12202
10-07 14:35:09.502 12202-12202/com.es0329.workshop E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
10-07 14:35:09.502 12202-12202/com.es0329.workshop E/AndroidRuntime: at com.es0329.workshop.PreviewDialog.updateUi(PreviewDialog.java:112)
10-07 14:35:09.502 12202-12202/com.es0329.workshop E/AndroidRuntime: at com.es0329.workshop.PreviewDialog.onEvent(PreviewDialog.java:97)
10-07 14:35:09.502 12202-12202/com.es0329.workshop E/AndroidRuntime: at com.es0329.workshop.EventBus.publish(EventBus.java:40)
10-07 14:35:09.502 12202-12202/com.es0329.workshop E/AndroidRuntime: at com.es0329.workshop.MusicService$2.onPrepared(MusicService.java:50)
10-07 14:35:09.502 12202-12202/com.es0329.workshop E/AndroidRuntime: at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:2548)
10-07 14:35:09.502 12202-12202/com.es0329.workshop E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
10-07 14:35:09.502 12202-12202/com.es0329.workshop E/AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
10-07 14:35:09.502 12202-12202/com.es0329.workshop E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5289)
10-07 14:35:09.502 12202-12202/com.es0329.workshop E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
10-07 14:35:09.502 12202-12202/com.es0329.workshop E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
10-07 14:35:09.502 12202-12202/com.es0329.workshop E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
10-07 14:35:09.502 12202-12202/com.es0329.workshop E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
更新#2。邮政编码片段。 MediaPlayer准备就绪后,会通知对话框。如果对话框收到" READY"它调用下面的#updateUi。据我所知,在我的对话框(包含timeRemaining textView)被附加之前,服务开始并且媒体播放器数据已准备好/可用。
private void updateUi(MediaPlayer player) {
int timeRemainingValue = player.getDuration();
timeRemaining.setText(String.valueOf(timeRemainingValue)); // NPE!
}
答案 0 :(得分:0)
在处理Null指针异常的剩余时间设置周围添加一个try catch语句。
一般评论:我在我的服务中创建了一个新线程,用于更新UI信息(即持续时间文本和SeekBar)。