Как только приложение открывается, я использую 2-секундный таймер обратного отсчета. Через 2 секунды я вижу линейный макет и невидимый индикатор выполнения. Причина, по которой я использую это, заключается в том, что я могу получить все данные через firebase и назначить их соответствующим текстовым полям. Однако, если я перехожу к другому действию во время таймера обратного отсчета, программа вылетает.
object : CountDownTimer(1000, 1000) {
override fun onTick(p0: Long) {
}
override fun onFinish() {
linearLayout_profile.visibility = View.VISIBLE
progressBar_profile.visibility = View.INVISIBLE
}
}.start()
2020-12-10 00:50:24.118 1742-1742/com.burakergun.emre E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.burakergun.emre, PID: 1742
java.lang.NullPointerException: linearLayout_profile must not be null
at com.burakergun.emre.Fragment.ProfileFragment$onViewCreated$3.onFinish(ProfileFragment.kt:66)
at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:127)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
2020-12-10 00:50:24.185 1742-1742/com.burakergun.emre I/Process: Sending signal. PID: 1742 SIG: 9
Я проверяю logcat и показываю фатальную ошибку. Ошибка говорит, что linearlayout_profile не должен быть нулевым. Как linearlayout_profile может быть нулевым. я этого не понимаю часть.
linearlayout_profile
имеет значение null, потому что вы перешли к другому действию, и нет ссылки на linearlayout_profile
и, следовательно, значение null.
Вам нужно добавить нулевую проверку, чтобы предотвратить сбой.
когда вы перешли к другому действию, вы должны уничтожить таймер
override fun onDestroy() {
super.onDestroy()
timer?.cancel()
}
private var countDownTimer: CountDownTimer? = null
private fun startTimer() {
countDownTimer = object : CountDownTimer(100000, 1000) {
override fun onTick(millisUntilFinished: Long) {
val secondsUntilFinished: Long = ceil(millisUntilFinished.toDouble() / 1000).toLong()
val string: String = getString(R.string.resend_code_after).replace("*", secondsUntilFinished.toString())
binding.resendOTP.text = string
}
override fun onFinish() {
val string: String = getString(R.string.resend_code)
binding.resendOTP.text = string
}
}.start()
}
затем, когда вы хотите изменить фрагмент или действие, используйте этот код в функции onClick или Nav, чтобы отменить обратный отсчет перед изменением фрагмента или действия.
countDownTimer!!.cancel()
Я не подумал проверить, является ли он нулевым или не нулевым. Спасибо.