Как исправить NPE во ViewRoot # updateBidiOptions? - PullRequest
26 голосов
/ 04 апреля 2011

В консоли разработчика на рынке Android мы получаем множество трассировок стека, подобных этой (отправленной пользователями при сбое нашего приложения):

java.lang.NullPointerException at
android.view.ViewRoot.updateBidiOptions(ViewRoot.java:290) at
android.view.ViewRoot.performTraversals(ViewRoot.java:737) at
android.view.ViewRoot.handleMessage(ViewRoot.java:1792) at
android.os.Handler.dispatchMessage(Handler.java:99) at
android.os.Looper.loop(Looper.java:143) at
android.app.ActivityThread.main(ActivityThread.java:5068) at
java.lang.reflect.Method.invokeNative(Native Method) at
java.lang.reflect.Method.invoke(Method.java:521) at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) at
dalvik.system.NativeStart.main(Native Method)

Нам не удалось воспроизвести сбойа также, когда мы проверяем исходный код Android, нет метода с именем updateBidiOptions.Комментарии пользователей, кажется, предполагают, что сбой происходит, когда они фокусируются на EditText.Многие пользователи также упоминают, что это происходит в HTC Desire HD, но это не приводит к сбоям в Desires, которые мы здесь имеем.

Как мы можем решить эту проблему?

Ответы [ 4 ]

2 голосов
/ 17 июня 2011

Обычно, когда вы видите NPE в трассировке стека, в котором не используется какой-либо ваш собственный код, в какой-то момент вы передаете значение null в качестве параметра в платформу Android, где вы не должны.

Так что, если у вас есть место в коде, где вы можете сомневаться, если вы передаете значение null в качестве опции, дважды проверьте, что вам разрешено это делать.

Иначе, в какой версии Android происходит этот сбой?

Если у нас есть правильный источник для android.view.ViewRoot.updateBidiOptions(ViewRoot.java:290), мы сможем увидеть, какая ссылка ссылается и является нулевой ссылкой. И отступайте оттуда, пока мы не увидим ссылку, предоставленную вашим источником (которая, вероятно, также равна нулю).

Однако, когда я смотрю на источник для ViewRoot.java в моем пряничном клоне, я даже не вижу метод updateBidiOptions(). Таким образом, мне нужно знать примерную версию Android, чтобы дать обоснованное предположение, на какую ссылку это может быть.

1 голос
/ 22 мая 2013

Просто чтобы закончить это: проблема была с пользовательским ПЗУ (B0.8). Проблема разрешилась, когда это ПЗУ было обновлено до B0.8.4, который больше не вызывает updateBidiOptions.

0 голосов
/ 16 августа 2011

Кажется, что здесь происходит 1 из 2 возможных событий.

Возможно, что исследователи из Массачусетского технологического института решили использовать ваше приложение для тестирования экспериментальной технологии, получившей название BiDi Screen . Вполне вероятно, что они модифицировали некоторые ОС Android и перекомпилировали их для взаимодействия с экспериментальной технологией, возможно, работающей на каком-то экспериментальном мобильном устройстве. Возможно, вы обнаружили один из «черных проектов» Google.

Другая идея заключается в том, что вы видите ошибку «Локализация строки» из другой страны. См. Класс Bidi .

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

Поскольку вы работаете в более крупной компании, попросите своего вышестоящего сотрудника отправить вас в поездку по сбору информации в одну из стран Арабской весны, чтобы собрать «полевые данные» о том, почему ваше приложение так часто падает.

0 голосов
/ 03 июня 2011

ок, простое решение будет таким: найдите строку, которая на самом деле вызывает это в вашем коде, если вы говорите, что это текст редактирования, поэтому оберните все, что ему принадлежит, в try и catch, а затем в catch, try doчто он должен был сделать в первый раз, если он должен дать фокус текста редактирования, запросить фокус для него.

Надеюсь, это поможет, С наилучшими пожеланиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...