Если мы изменим фрагмент до завершения обратного отсчета, приложение вылетит в Android

Как только приложение открывается, я использую 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 может быть нулевым. я этого не понимаю часть.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
324
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

linearlayout_profile имеет значение null, потому что вы перешли к другому действию, и нет ссылки на linearlayout_profile и, следовательно, значение null.

Вам нужно добавить нулевую проверку, чтобы предотвратить сбой.

Я не подумал проверить, является ли он нулевым или не нулевым. Спасибо.

Burak Ergün 09.12.2020 23:12

когда вы перешли к другому действию, вы должны уничтожить таймер

   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()

Другие вопросы по теме