如何解决Xamarin android异步任务异常
我正在处理一个 Xamarin Android 项目,当我关闭/打开设备屏幕或转到另一个应用程序并返回到我的项目应用程序时,我的问题随机出现在异步任务中。由于我处理了异常,问题并没有使我的应用程序崩溃,但我不知道如何修复它。
Mainactivity代码:
public class MainActivity
{
private ClassA classA;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
classA = new ClassA();
}
protected override void OnResume()
{
base.OnResume();
Scan();
}
private async Task Scan()
{
try
{
bool isServerAvailable = await classA.MethodA();
// - result process
}
catch (Exception ex)
{
Log.Error("MainActivity",$"classA null: {classA == null} / exception:{ex.GetType().Name} / target:{ex.TargetSite} / helplink:{ex.HelpLink} / source:{ex.source} / stacktrace:{ex.StackTrace}" );
}
}
}
以及 ClassA 的代码:
public class ClassA
{
public async Task<bool> MethodA()
{
try
{
// - HTTP web request / return true or false
}
catch (WebException ex)
{
var exceptionCode = ex.Response as HttpWebResponse;
var errorMsg = exceptionCode.StatusCode.ToString();
Log.Error("ClassA",$"exception1:{errorMsg}");
return false;
}
catch (Exception e)
{
Log.Error("ClassA",$"exception2:{e.GetType().Name}";
return false;
}
}
}
2021-04-13 23:25:40.822 24368-12495/? E/asoq: Phenotype API error. Event # ckzo@6b0d1a99,EventCode: 5 [CONTEXT service_id=51 ]
asnv: 29501: Stale snapshot (change count changed - expected 189 but was 188)
at asot.b(:com.google.android.gms@211212039@21.12.12 (120408-364497763):14)
at asos.b(:com.google.android.gms@211212039@21.12.12 (120408-364497763):0)
at asoq.a(:com.google.android.gms@211212039@21.12.12 (120408-364497763):4)
at asoq.fT(:com.google.android.gms@211212039@21.12.12 (120408-364497763):12)
at aciv.run(:com.google.android.gms@211212039@21.12.12 (120408-364497763):17)
at btua.run(:com.google.android.gms@211212039@21.12.12 (120408-364497763):2)
at ull.c(:com.google.android.gms@211212039@21.12.12 (120408-364497763):6)
at ull.run(:com.google.android.gms@211212039@21.12.12 (120408-364497763):7)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at uri.run(:com.google.android.gms@211212039@21.12.12 (120408-364497763):0)
at java.lang.Thread.run(Thread.java:919)
2021-04-13 23:25:40.823 24368-12495/? E/Asyncoperation: operation=CommitToConfigurationoperationCall,opStatusCode=29501 [CONTEXT service_id=51 ]
OperationException[Status{statusCode=Stale snapshot (change count changed - expected 189 but was 188),resolution=null}]
at asoq.a(:com.google.android.gms@211212039@21.12.12 (120408-364497763):6)
at asoq.fT(:com.google.android.gms@211212039@21.12.12 (120408-364497763):12)
at aciv.run(:com.google.android.gms@211212039@21.12.12 (120408-364497763):17)
at btua.run(:com.google.android.gms@211212039@21.12.12 (120408-364497763):2)
at ull.c(:com.google.android.gms@211212039@21.12.12 (120408-364497763):6)
at ull.run(:com.google.android.gms@211212039@21.12.12 (120408-364497763):7)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at uri.run(:com.google.android.gms@211212039@21.12.12 (120408-364497763):0)
at java.lang.Thread.run(Thread.java:919)
>E/MainActivity: classA null: False / exception:NullReferenceException / target:Void Throw() / helplink: / source:mscorlib / stacktrace: at Namespace.ClassA.MethodA() [0x001b2] in <4c4350f04c95435983dd7984b1e1d5ec>:0
at Namespace.MainActivity.Scan() [0x000f3] in <4c4350f04c95435983dd7984b1e1d5ec>:0
我不知道为什么会出现 NullReferenceException,因为我的对象实例不为 null。
此外,MethodA 异常不会打印日志错误。
对此有什么帮助吗?
谢谢。
问候,萨米。
解决方法
我怀疑 GC 转入并收集了对 classA 的引用,因此它变为 null。尝试将 A 类的初始化向下移动到您的 OnResume
。这样每次应用程序进入该页面时它仍然存在。您可以尝试将 classA 视为单例,同时检查该类是否为 null,如果是,则仅重新初始化它。
例如:
protected override void OnResume()
{
base.OnResume();
if(classA == null) {
classA = new ClassA();
}
Scan();
}
,
我没有发表评论的名声。所以我必须写一个答案。查看堆栈跟踪,似乎在 MethodA() 内部抛出了 NullReferenceException,您能否用该方法的完整代码更新问题?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。