所以我有一个计时器和多个片段。如果计时器正在运行,则在片段之间切换时没有问题。但是当计时器完成onFinish()
并且如果用户当时处于另一个片段中时,应用程序崩溃。
以下是一些日志:
1)E/RingtoneManager: Failed to open ringtone content://settings/system/notification_sound: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
2)java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.Ringtone.setStreamType(int)' on a null object reference
这是我的onFinish()
:
@Override
public void onFinish() {
timerTextView.setText("00:00");
timerSeekBar.setEnabled(true);
Log.i("Timer", "Finished!");
// Alarm sound for ending
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone timerEnded = RingtoneManager.getRingtone(getContext(), notification);
timerEnded.setStreamType(AudioManager.STREAM_ALARM);
timerEnded.play();
}
据我所知,碰撞是造成警报的原因。如何解决这个问题?
编辑:应该澄清我希望计时器继续运行并完成,即使用户在另一个片段中也是如此。
答案 0 :(得分:0)
像这样修改:
@Override
public void onFinish() {
timerTextView.setText("00:00");
timerSeekBar.setEnabled(true);
Log.i("Timer", "Finished!");
// Alarm sound for ending
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone timerEnded = RingtoneManager.getRingtone(getApplicationContext(), notification);
timerEnded.setStreamType(AudioManager.STREAM_ALARM);
timerEnded.play();
}
答案 1 :(得分:0)
如果您希望计时器在用户离开片段时完成,那么您可以使用onstop并在那里停止计时器。
或者,如果您希望计时器在用户回来时暂停,您可以存储剩余的秒数并启动计时器。
根据你的情况,我认为你应该阅读这篇文章并使用asynctask。
https://stackoverflow.com/a/14611934/5308202
在从asynctask访问ui之前检查。