Приложение вылетает во время инициализации из-за открытого диалога - PullRequest
0 голосов
/ 07 мая 2020

Этот cra sh уже давно появляется в моей консоли разработчика, и мне не удалось воспроизвести его каким-либо образом.

У меня есть приложение, которое запускается с MainActivity. В onCreate некоторые данные загружаются асинхронно из серверной части. При нажатии кнопки в этом действии открывается диалоговое окно, в котором отображаются некоторые данные, загруженные с сервера.

Это черт sh:

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.******.******/com.******.******.MainActivity}: com.******.******.users.UserData$DataNotFoundException: Requested element not found
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
       at android.app.ActivityThread.-wrap11(ActivityThread.java)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
       at android.os.Handler.dispatchMessage(Handler.java:105)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6942)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

Caused by com.******.******.users.UserData$DataNotFoundException: Requested element not found
       at com.******.******.users.UserData.getData(UserData.java:478)
       at com.******.******.UserDialog.onCreateDialog(UserDialog.java:87)
       at androidx.fragment.app.DialogFragment.onGetLayoutInflater(DialogFragment.java:380)
       at androidx.fragment.app.Fragment.performGetLayoutInflater(Fragment.java:1412)
       at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
       at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
       at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
       at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2659)
       at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManagerImpl.java:2613)
       at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:246)
       at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:542)
       at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
       at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1341)
       at android.app.Activity.performStart(Activity.java:7200)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2920)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
       at android.app.ActivityThread.-wrap11(ActivityThread.java)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
       at android.os.Handler.dispatchMessage(Handler.java:105)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6942)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

Меня смущает то, что что ошибка sh происходит в performLaunchActivity из-за ошибки sh, пока диалог расширяется. Однако диалоговое окно создается не в onCreate действия, а только после того, как пользователь нажимает кнопку. Однако кнопка не нажимается (я добавил журнал в прослушиватель кликов, и он никогда не вызывается).

Я видел сбои с аналогичными шаблонами в трекерах проблем GitHub, но без ответов, так что это похоже на распространенный шаблон, но его трудно отладить.

Вопрос в том, в каком случае Dialog может быть создан из performLaunchActivity, даже если в методе onCreate () нет ссылки на диалог. Я предполагаю, что это связано с жизненным циклом действий, но мне не удалось его разгадать.

Ответы [ 5 ]

2 голосов
/ 14 мая 2020

Ваша ошибка sh, вероятно, происходит, когда экран вращается, или приложение восстанавливается после остановки процесса в фоновом режиме. В этом случае DialogFragment создается без взаимодействия с пользователем. Вы проверили и обсудили эти сценарии ios?

Вероятно, вы захотите передать данные в качестве аргумента при открытии диалогового окна согласно документации . Таким образом, система воссоздает диалоговое окно с сохраненными данными.

1 голос
/ 15 мая 2020

Если Android необходимо воссоздать действие, когда отображается диалоговое окно, он повторно создаст диалоговое окно, когда оно воссоздает действие. Например, ваше действие может быть прекращено, когда оно находится в фоновом режиме, чтобы освободить память для приложения переднего плана.

В этом случае в вашем диалоговом окне могут возникнуть проблемы, если он использует данные в памяти, которые существовали до того, как действие было прекращено. , но эти данные не создаются снова с диалоговым окном.

По этой причине диалоги имеют аргументы, которые сохраняются и передаются диалогу при его воссоздании. Используйте setArguments (Bundle args) для передачи данных в диалоговое окно.

0 голосов
/ 15 мая 2020

Вот почему у большинства приложений есть экран загрузки при асинхронной выборке данных. Возможно, в вашем коде все в порядке, но пользователь каким-то образом может нажать кнопку до того, как данные будут получены. Вы можете попробовать развернуть приложение на эмуляторе низкоэффективного телефона. Проверьте модель телефона, на котором происходят сбои

0 голосов
/ 15 мая 2020

на основе вашей трассировки стека, я предполагаю, что у вас есть функция или вы используете какую-то глобальную переменную, которая изменяется, когда вы асинхронно получаете ваши данные, а затем вылетает, потому что ваш dialog еще не накачан.

my Лучше всего предположить, что вы использовали DialogFragment, и его жизненный цикл немного отличается от обычного фрагмента, и он пытается подготовить данные, которые будут в макете.

Я просто предполагаю здесь потому что ваш вопрос недостаточно ясен, но для отладки и устранения этой проблемы я предлагаю вам изменить свой метод getData и поместить в него постоянные данные, чтобы увидеть, происходит ли по-прежнему cra sh, если cra sh остановился, это из-за переменной, которую вы использовали, и должны обрабатывать жизненный цикл фрагмента и диалога, чтобы исправить cra sh, и если cra sh все еще произойдет, измените на обычный фрагмент и просто опубликуйте, что происходит, чтобы я мог знать, что происходит.

в целом это происходит, когда вы используете какую-либо переменную или заполняете некоторые представления данными, которые еще не сгенерирован, это также может быть вызвано этим асинхронным методом, если вы пытаетесь изменить представления или переменные, которые уже используются в основном потоке.

держите меня в курсе и надеюсь, что это поможет.

0 голосов
/ 11 мая 2020

@ ig343

Похоже, ваша проблема возникла из-за

Caused by com.******.******.users.UserData$DataNotFoundException: Requested element not found
   at com.******.******.users.UserData.getData(UserData.java:478)

Вариант 1: используйте обработчик исключений {попробуйте поймать для обработки исключения DataNotFoundException} для строки (UserData. java: 478 ) и зарегистрируйте ошибку.

Вариант 2: Попробуйте дать всем запрошенным значениям элемента как null.

Удачи ....

...