我有一个处理通知的 Android Xamarin 应用程序。显示通知时,有一些按钮要求响应。应用程序需要通过 httpClient.PostAsync 调用将此响应发送回服务器。我在代码的其他部分使用相同的 http 客户端包装器,它工作正常。但是,当我从 JobService 代码中调用它时,应用程序崩溃了。我已将 http 调用包含在 try/catch 中,并且没有发生异常。设备日志中也没有错误。我想知道如何调试它。这是我的流程:
我有一个使用 OnMessageReceived 方法从 FirebaseMessagingService 派生的类。当通知到达时会调用它。我通过通知管理器构建本地通知并调用 .Notify。通知与按钮一起出现。我有一个带有 OnReceive 方法的 BroadcastReceiver。该方法安排一个工作来完成按钮点击的后退。作业开始运行,直到我调用 PostAsync。从那里它毫无例外地崩溃。这是 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;
}
任何人都可以提供线索说明为什么会失败或我如何收集诊断信息以找出正在发生的事情吗?正如我提到的,异常没有被捕获,我创建的任务被标记为已完成,并且没有消息被发布。