【问题标题】:Xamarin android async task exceptionXamarin android异步任务异常
【发布时间】:2021-07-05 16:21:27
【问题描述】:

我正在开发一个 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;
}
}
}

logcat 打印的错误显示如下:

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,因为我的对象实例不为空。

此外,不会从 MethodA 异常中打印日志错误。

有什么帮助吗?

谢谢。

问候,萨米赫。

【问题讨论】:

  • 你检查HTTP web request / return true or false的部分了吗?哪一行抛出了这个错误?
  • 嗨,引发错误的行是bool isServerAvailable = await classA.MethodA();。我的 http web 请求不起作用,因为我的 classA 实例有 NullReferenceException。但是当我检查它是否为空时,它总是返回假。所以我不知道为什么会出现异常。
  • 我再次检查了您的代码,没有` // - HTTP Web 请求/返回 true 或 false. I use return true;` 。没有错误。请再次检查。

标签: android xamarin asynchronous task nullreferenceexception


【解决方案1】:

我怀疑 GC 滚动并收集了对 classA 的引用,因此它变为 null。尝试将 A 类的初始化移至您的 OnResume。这样,每次应用程序进入该页面时,它仍然存在。您可以尝试将 classA 视为单例,同时检查该类是否为空,如果是则仅重新初始化它。

例如:

protected override void OnResume()
{
   base.OnResume();
   
   if(classA == null) {
     classA = new ClassA();
   }

   
   Scan();
}

【讨论】:

  • 嗨,谢谢,但这个解决方案对我不起作用。我用新信息更新了日志。
【解决方案2】:

我没有发表评论的声誉。所以我必须写一个答案。查看堆栈跟踪,似乎在 MethodA() 中抛出了 NullReferenceException,您能否将问题更新为该方法的完整代码?

【讨论】:

    猜你喜欢
    • 2019-02-19
    • 2012-10-26
    • 2012-09-27
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多