httpClient.PostAsyn c вылетает приложение в Xamarin Android JobService - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть Android приложение Xamarin, которое обрабатывает уведомления. Когда отображается уведомление, есть кнопки, которые запрашивают ответ. Приложение должно отправить этот ответ обратно на сервер через вызов httpClient.PostAsyn c. Я использую такую ​​же оболочку http-клиента в других частях кода, и она работает правильно. Однако, когда я вызываю его из кода JobService, приложение вылетает. Я включил HTTP-вызов в try / catch, и исключений не возникает. Также нет ошибок в журнале устройства. Я хотел бы знать, как отладить это. Вот мой поток:

У меня есть класс, производный от FirebaseMessagingService с методом OnMessageReceived. Это вызывается, когда приходит уведомление. Я строю локальное уведомление через менеджер уведомлений и звоню .Notify. Уведомление появляется с кнопками. У меня есть BroadcastReceiver с методом OnReceive. Этот метод планирует задание, чтобы сделать пост назад нажатия кнопки. Работа начинается и выполняется до момента, когда я вызываю PostAsyn c. Оттуда он падает без исключения. Вот соответствующая часть JobWorker:

        public override bool OnStartJob(JobParameters jobParams)
        {
            _backgroundWorker = Task.Run(() => { DoWork(jobParams); });
            return true;
        }

        private void DoWork(JobParameters jobParams)
        {
            var logger = App.ResolveDependency<ILogger>() as ILogger;
            var callActions = App.ResolveDependency<ICallActionsHandler>() as ICallActionsHandler;

            var callToken = jobParams.Extras.GetString(JobParameterCallToken);
            var subsciberPhoneNumber = jobParams.Extras.GetString(JobParameterSubscriberPhoneNumber);
            var action = jobParams.Extras.GetString(JobParametersCallAction);

            logger.TraceInfo($"starting {nameof(CallActionService)}: starting job {jobParams.JobId}");
            callActions.SendAction(
                callToken,
                subsciberPhoneNumber,
                (CallActions)Enum.Parse(typeof(CallActions), action));
        }

Код SendAction вызывает оболочку клиента http. Код оболочки клиента http выглядит следующим образом:

        public async Task<int> PostAsync(string api, object message)
        {
            var apiUrl = Constants.DefaultAppApi + api;
            var contentText = JsonConvert.SerializeObject(message);
            var content = new StringContent(contentText, Encoding.UTF8, "application/json");
            var backOff = 10;
            var retryCount = 5;
            HttpResponseMessage response = null;

            for (var attempt = 1; attempt <= retryCount; attempt++)
            {
                _logger.TraceInfo($"DataServerClient Post message: {message.GetType().Name}, attempt = {attempt}");
                try
                {
                   response = await _client.PostAsync(apiUrl, content);
                }
                catch (Exception ex)
                {
                    if (attempt == retryCount)
                        _logger.TraceException($"DataServerClient Post failed", ex);
                }

                if (response != null && response.IsSuccessStatusCode)
                {
                    _logger.TraceInfo($"DataServerClient post was successful at retry count: {attempt}");
                    break;
                }

                backOff *= 2;
                await Task.Delay(backOff);
            }

            return (int)response.StatusCode;
        }

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

...