NullReferenceException в System.Threading.Tasks.RangeWorker.FindNewWork в приложении Android Xamarin - PullRequest
0 голосов
/ 28 августа 2018

В моем собственном Android-приложении, созданном с помощью Xamarin, я получаю следующий отчет о сбое в HockeyApp:

Xamarin caused by: android.runtime.JavaProxyThrowable: System.NullReferenceException: Object reference not set to an instance of an object
  at System.Threading.Tasks.RangeWorker.FindNewWork (System.Int64& nFromInclusiveLocal, System.Int64& nToExclusiveLocal) [0x00000] in <8f1acca5a43d45c5b8d35add5a11806a>:0 
  at System.Threading.Tasks.RangeWorker.FindNewWork32 (System.Int32& nFromInclusiveLocal32, System.Int32& nToExclusiveLocal32) [0x00000] in <8f1acca5a43d45c5b8d35add5a11806a>:0 
  at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () <0xec919968 + 0x00033> in <8f1acca5a43d45c5b8d35add5a11806a>:0

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

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

Судя по данным, связанным с этими сбоями, проблема возникает исключительно на устройствах Samsung (S8, S8 + и Note8). Я не могу быть уверен на 100%, что это не влияет на другие устройства, но у меня есть только отчеты о сбоях для них.

Есть идеи, что может вызвать эти сбои? Я делаю что-то не так с потоками, может быть, с токенами отмены? Есть ли условия, с которыми я не справляюсь?

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

Спасибо

РЕДАКТИРОВАТЬ:

Я понимаю, что не так уж и много, но так как это единственная трассировка стека, которую я получаю в HockeyApp, и я не могу воспроизвести, я понятия не имею, какой код вызывает это.

То, что я ищу, - это больше подсказка о том, что может привести к тому, что в поточном коде Mono возникнет исключение нулевой ссылки, когда я сам не управляю потоками. Или, может быть, эта трассировка стека - просто красная сельдь, и мне нужно искать в других местах?

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Я знаю, что этот ответ не является специфическим для вашей проблемы, но когда вы имеете дело с сообщением об исключении, которое является настолько кратким, всегда полезно проверять ведение журнала в масштабе всей системы. В случае Android вы можете получить больше информации, используя команду dmesg (которая дает вам содержимое файла /var/log/messages).

Удачи

0 голосов
/ 04 сентября 2018

Вам следует позвонить .IsCompleted или .Wait() вскоре после обратного вызова. Если вы сделаете это до того, как объекты Context могут исчезнуть, и если ваш код обращается к этим объектам Context, они будут произвольно нулевыми (удалены). Если вы вызовете Task.Wait(), он заблокирует поток и затем сгенерирует исключение AggregateException после того, как работник его сгенерирует. Попробуйте использовать блок try catch для обработки исключения.

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

0 голосов
/ 03 сентября 2018

Что привлекло мое внимание, был вызов FindNewWork32 - ссылка для реализации .NET . Ваше приложение может быть скомпилировано для 32-битной архитектуры, а упомянутые вами устройства Samsung имеют 64-битный процессор.

В этой статье Microsoft показано, как нацелить приложение на одну или несколько поддерживаемых Android архитектур ЦП. Вам может потребоваться таргетинг на несколько платформ:

Чтобы выбрать несколько архитектур ЦП, вы можете выбрать более одного ABI. (за счет большего размера файла APK). Вы можете использовать Generate один пакет (.apk) для выбранной опции ABI (описан в разделе «Установка упаковки»). Свойства), чтобы создать отдельный APK для каждой поддерживаемой архитектуры.

Вам не нужно выбирать arm64-v8a или x86_64 для целевого 64-битного устройства; 64-битная поддержка не требуется для запуска вашего приложения на 64-битной аппаратное обеспечение. Например, 64-разрядные устройства ARM (такие как Nexus 9) могут запускать приложения, настроенные для armeabi-v7a. Основное преимущество включения 64-битная поддержка позволяет вашему приложению обращаться к большему количеству память.

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