У меня есть 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;
}
Может кто-нибудь дать подсказки, почему это не удается или как я могу собрать диагностику, чтобы узнать, что происходит? Как я уже упоминал, исключение не перехватывается, созданная мной задача помечается как выполненная, и никакое сообщение не публикуется.