Android应用程序抛出:Java.Lang.在onSaveInstanceState后不能执行此操作

本文关键字:onSaveInstanceState 不能 执行 操作 Lang 应用程序 Java Android | 更新日期: 2023-09-27 18:17:11

为了缩短问题:我正在开发一个需要用户登录的android应用程序,由于多个用户可以同时登录,我想使用NFC触摸卡在经过认证的用户之间循环。一切工作正常,除了使用ZXing.Mobile条形码扫描器之后,当代码从扫描任何条形码返回时,并试图推送页面模型,这个特殊的异常被抛出Java.Lang.IllegalStateException: Can not perform this action after onSaveInstanceState。请注意,我正在使用Xamarin。表单,FreshMVVM, ZXing。移动版,当然还有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标签启动应用程序。SplashActivity发射MainActivity

SplashActivity.cs:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    StartActivity(typeof(MainActivity));
}
protected override void OnResume()
{
    base.OnResume();
    if (NfcAdapter.ActionNdefDiscovered == Intent.Action)
    {
        ProcessIntent(Intent);
    }
}
protected override void OnNewIntent(Intent intent)
{
    Intent = intent;
}
public void ProcessIntent(Intent intent)
{
    //Code omitted to simplify the question.
}
上面的代码显示只是为了知道我是如何使用NFC触摸事件。

从主页模型打开条形码扫描器的代码:

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);

From scan service:

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;
}

编辑:包含推送页面模型方法的代码:

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();
}

此代码在扫描条形码返回后直接触发。
结束编辑

所有这些都在触摸NFC卡并启动应用程序后工作,直到点击下一行代码。从扫描器返回条形码后:
await CoreMethods.PushPageModel<SecondaryPageModel>(response).ConfigureAwait(true);

异常在这里被抛出。我调试了我的代码,看看发生了什么。当相机打开时,它首先触发MainActivity OnSaveInstanceState事件,在成功扫描条形码后,MainActivity OnResume> MainActivity OnPostResume事件按此顺序触发。然后调用PushPageModel方法。注意,当我在相对字段中手动输入条形码时,一切正常,只是扫描器抛出了这个异常。

我在SO中搜索了解决方案。我发现了一些答案,说选择退出base.OnSaveInstanceState()行,我尝试了没有运气,另一个答案说输入垃圾值来解决这个问题,尝试了没有运气。我在AndroidManifest文件中尝试了不同的启动模式,如singleTopsingleTasksingleInstance,也没有运气。

如果能得到任何帮助,我将很高兴。

Android应用程序抛出:Java.Lang.在onSaveInstanceState后不能执行此操作

MainActivity正在运行多个实例,当你使用NFC切换时,添加到MainActivity LaunchMode作为SingleTask,然后当你使用NFC启动清除任务并创建一个新的。指定活动标志的一个好方法是使用Xamarin属性,这比在Manifest.xml

中添加它们更好。
相关文章:
  • 没有找到相关文章