Android 应用程序抛出:Java.Lang.IllegalStateException,消息:在 onSaveInstanceState 之后无法执行此操作
Android application throwing: Java.Lang.IllegalStateException, with message: Can not perform this action after onSaveInstanceState
为了缩短问题:我正在开发一个需要用户登录的android应用程序,并且由于多个用户可以同时登录,我想在使用 NFC 触摸卡的经过身份验证的用户之间循环。一切正常,除了在使用 ZXing.Mobile
条码扫描器之后,当扫描任何条码的代码 returns 并尝试推送页面模型时,将抛出此特定异常 Java.Lang.IllegalStateException: Can not perform this action after 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 标签启动。 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);
来自扫描服务:
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 文件中尝试了不同的启动模式,例如 singleTop
或 singleTask
或 singleInstance
也没有成功。
我很乐意提供任何帮助。提前致谢。
MainActivity 是 运行 多个实例,当您使用 NFC 切换时,添加到 MainActivity LaunchMode 为 SingleTask,然后当您使用 NFC 启动时清除任务并创建一个新的一个。指定 Activity 标志的一个好方法是使用 Xamarin 属性,这是比在 Manifest.xml
中添加它们更好的方法
为了缩短问题:我正在开发一个需要用户登录的android应用程序,并且由于多个用户可以同时登录,我想在使用 NFC 触摸卡的经过身份验证的用户之间循环。一切正常,除了在使用 ZXing.Mobile
条码扫描器之后,当扫描任何条码的代码 returns 并尝试推送页面模型时,将抛出此特定异常 Java.Lang.IllegalStateException: Can not perform this action after 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 标签启动。 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);
来自扫描服务:
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 文件中尝试了不同的启动模式,例如 singleTop
或 singleTask
或 singleInstance
也没有成功。
我很乐意提供任何帮助。提前致谢。
MainActivity 是 运行 多个实例,当您使用 NFC 切换时,添加到 MainActivity LaunchMode 为 SingleTask,然后当您使用 NFC 启动时清除任务并创建一个新的一个。指定 Activity 标志的一个好方法是使用 Xamarin 属性,这是比在 Manifest.xml
中添加它们更好的方法