Java 计时器onFinish()在另一个片段中崩溃应用程序

Java 计时器onFinish()在另一个片段中崩溃应用程序,java,android,android-fragments,timer,Java,Android,Android Fragments,Timer,所以我有一个计时器和多个片段。如果计时器正在运行,则在片段之间切换时不会出现问题。但是当计时器完成时,如果用户当时在另一个片段中,应用程序就会崩溃 以下是一些日志: 1) E/RingtoneManager:无法打开铃声content://settings/system/notification_sound: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.Object android.content.Context.getSys

所以我有一个计时器和多个片段。如果计时器正在运行,则在片段之间切换时不会出现问题。但是当计时器完成时,如果用户当时在另一个片段中,应用程序就会崩溃

以下是一些日志:

1)
E/RingtoneManager:无法打开铃声content://settings/system/notification_sound: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.Object android.content.Context.getSystemService(java.lang.String)”

2)
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.media.Ringtone.setStreamType(int)”

这是我的
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(getApplicationContext(), notification);
                        timerEnded.setStreamType(AudioManager.STREAM_ALARM); 
                        timerEnded.play();

                    }

若您希望在用户离开片段时计时器完成,那个么您可以使用onstop并在那个里停止计时器

或者,若您想让计时器在用户回来时暂停,您可以存储剩余的秒数并启动计时器

根据你的情况,我认为你应该读一下这篇文章,然后继续完成这项任务


在从asynctask访问ui之前进行检查。

请参阅我应该提到的完整代码,我只有一个活动。如果我使用这个解决方案,我必须使用getActivity().getApplicationContext(),否则单一的getApplicationContext()将无法工作。我没有意识到您正在使用一个片段,很遗憾,它没有。我有一个活动和多个片段。如果im超出此计时器片段,当计时器完成时,它将崩溃。应该说明我希望计时器继续运行并完成,即使用户在另一个片段中。
 @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();

                    }