如果在另一个片段中,Timer onFinish()会崩溃应用程序

时间:2017-05-17 19:18:19

标签: java android android-fragments timer

所以我有一个计时器和多个片段。如果计时器正在运行,则在片段之间切换时没有问题。但是当计时器完成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();

                    }

据我所知,碰撞是造成警报的原因。如何解决这个问题?

编辑:应该澄清我希望计时器继续运行并完成,即使用户在另一个片段中也是如此。

2 个答案:

答案 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之前检查。