C# Android应用程序抛出:Java.Lang.IllegalStateException,消息为:onSaveInstanceState之后无法执行此操作

C# Android应用程序抛出:Java.Lang.IllegalStateException,消息为:onSaveInstanceState之后无法执行此操作,c#,android,xamarin,zxing,freshmvvm,C#,Android,Xamarin,Zxing,Freshmvvm,为了缩短问题的时间:我正在开发一个android应用程序,它要求用户登录,而且由于可以同时登录多个用户,因此我希望使用NFC触摸卡在经过身份验证的用户之间切换。除了使用ZXing.Mobilebar code scanner之后,一切正常,当代码从扫描任何条形码返回并尝试推送页面模型时,会引发此特定异常Java.Lang.IllegalStateException:在onSaveInstanceState之后无法执行此操作。请注意,我使用的是Xamarin.Forms、FreshMVVM、ZXi

为了缩短问题的时间:我正在开发一个android应用程序,它要求用户登录,而且由于可以同时登录多个用户,因此我希望使用NFC触摸卡在经过身份验证的用户之间切换。除了使用
ZXing.Mobile
bar code scanner之后,一切正常,当代码从扫描任何条形码返回并尝试推送页面模型时,会引发此特定异常
Java.Lang.IllegalStateException:在onSaveInstanceState
之后无法执行此操作。请注意,我使用的是Xamarin.Forms、FreshMVVM、ZXing.Mobile,当然还有C#

使用的代码片段:

AndroidManifest.xml:

<activity android:name="com.name.SplashActivity">
    <intent-filter>
        <category android:name="android.intent.category.LAUNCHER" />
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="application/com.name.nfc" />
    </intent-filter>
</activity>
<activity android:name="com.name.MainActivity">
</activity>
显示以上代码只是为了了解我如何使用NFC touch事件

从主页模式打开条形码扫描仪的代码:

public ICommand OpenCameraCommand => new Command(async () =>
{
    IsAvailable = false;
    ((Command) OpenCameraCommand).ChangeCanExecute();
    string checkBarcode = await _scanService.CameraScanAsync().ConfigureAwait(true);
    if (!string.IsNullOrWhiteSpace(checkBarcode))
    {
        Barcode = checkBarcode;
    }
    IsAvailable = true;
}, () => IsAvailable);
从扫描服务:

public async Task<string> CameraScanAsync()
{
    //AutoFocus code omitted to simplify the question

    Result result = await _mobileBarcodeScanner.Scan(new MobileBarcodeScanningOptions { PossibleFormats = _listOfBarcodeFormats }).ConfigureAwait(false);

    return result == null ? string.Empty : result.Text;
}
公共异步任务CameraScanSync() { //省略自动对焦代码以简化问题 Result Result=await\u mobileBarcodeScanner.Scan(新的MobileBarcodeScanningOptions{possibleformas=\u listOfBarcodeFormats})。ConfigureAwait(false); 返回结果==null?字符串。空:result.Text; } 编辑: 包含推送页面模型方法的代码:

switch (response.Status)
{
    case Case.Second:
        await CoreMethods.PushPageModel<SecondaryPageModel>(response).ConfigureAwait(true);
        Barcode = string.Empty;
        return;
    case Case.Third:
        await CoreMethods.PushPageModel<ThirdPageModel>(response).ConfigureAwait(true);
        Barcode = string.Empty;
        return;
    case Case.Fourth:
        await CoreMethods.PushPageModel<FourthPageModel>(response).ConfigureAwait(true);
        Barcode = string.Empty;
        return;
    case Case.Invalid:
        break;
    default:
        throw new InvalidOperationException();
}
开关(响应状态)
{
案例二:
wait CoreMethods.PushPageModel(响应).configureWait(true);
条形码=字符串。空;
返回;
案例三:
wait CoreMethods.PushPageModel(响应).configureWait(true);
条形码=字符串。空;
返回;
案例四:
wait CoreMethods.PushPageModel(响应).configureWait(true);
条形码=字符串。空;
返回;
案例。无效:
打破
违约:
抛出新的InvalidOperationException();
}
扫描条形码返回后直接触发此代码。
结束编辑

在触摸NFC卡并启动应用程序后,所有这些都会起作用,直到到达下一行代码。从扫描仪返回条形码后:
wait CoreMethods.PushPageModel(响应)、configureWait(真)

此时正在抛出异常。我调试了我的代码来检查发生了什么。当摄像头打开时,它首先触发存储实例状态下的
main活动
事件,成功扫描条形码后,
main活动OnResume
main活动onpostsresume
事件按该顺序触发。然后调用
PushPageModel
方法请注意,当我在相对字段中手动输入条形码时,一切正常,只有扫描仪引发此异常。

我已经在这里寻找解决办法了。我找到了一些答案,上面写着退出
base.OnSaveInstanceState()
行,我尝试了,但没有运气,另一个答案说输入垃圾值来解决这个问题,也没有运气。我在AndroidManifest文件中尝试了不同的启动模式,比如
singleTop
singleTask
singleInstance
,但也没有成功


我很高兴能得到任何帮助。提前感谢。

使用NFC切换时,MainActivity正在运行多个实例,请将其作为SingleTask添加到MainActivity启动模式,然后在使用NFC启动时清除该任务并创建一个新实例。指定活动标志的一个好方法是使用Xamarin属性,这是一种比在清单中添加它们更好的方法。xml

能否请您也添加包含
等待核心方法的代码。PushPageModel(条形码)。ConfigureWait(true)line@Jj添加了代码,这只是验证条形码后的开关盒
switch (response.Status)
{
    case Case.Second:
        await CoreMethods.PushPageModel<SecondaryPageModel>(response).ConfigureAwait(true);
        Barcode = string.Empty;
        return;
    case Case.Third:
        await CoreMethods.PushPageModel<ThirdPageModel>(response).ConfigureAwait(true);
        Barcode = string.Empty;
        return;
    case Case.Fourth:
        await CoreMethods.PushPageModel<FourthPageModel>(response).ConfigureAwait(true);
        Barcode = string.Empty;
        return;
    case Case.Invalid:
        break;
    default:
        throw new InvalidOperationException();
}