Android断网再联网后MAUI Blazor应用出现未处理异常求助
问题描述
开发基于MAUI Blazor的应用,实现移动设备本地存储信息同步上传至数据库的功能。在Android设备上,断开网络后重新连接时,触发未处理异常:
System.ObjectDisposedException: 'ObjectDisposed_StreamClosed'
异常堆栈信息:
0xFFFFFFFFFFFFFFFF in Android.Runtime.JNIEnv.monodroid_debugger_unhandled_exception 0x1A in Android.Runtime.JNINativeWrapper._unhandled_exception at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:12,5 0x23 in Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PPLII_I at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:265,26 0xB in System.ThrowHelper.ThrowObjectDisposedException_StreamClosed 0x9 in System.IO.MemoryStream.EnsureNotClosed 0x9 in System.IO.MemoryStream.Read 0x9 in Android.Runtime.InputStreamAdapter.Read at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/InputStreamAdapter.cs:38,4 0x23 in Java.IO.InputStream.n_Read_arrayBII at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net7.0/android-33/mcw/Java.IO.InputStream.cs:264,4 0xD in Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PPLII_I at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:264,5
原因分析
- 流对象提前释放:网络断开时,上传请求被中断,对应的
MemoryStream或包装它的InputStreamAdapter被提前Dispose,但网络恢复后,重试逻辑仍尝试读取已释放的流对象,触发ObjectDisposedException。 - 跨平台流适配冲突:Android平台下
InputStreamAdapter是.NET流与Java流的桥接层,网络中断时Java侧可能主动关闭流资源,但.NET侧未同步标记流状态,导致后续读取操作失败。 - 重试逻辑复用无效资源:同步重试机制未在每次重试时重新创建流对象,而是复用了之前已被释放的实例,引发资源访问冲突。
解决思路
- 每次重试重新构建流:避免复用已存在的流实例,在重试上传前,从本地存储重新读取数据并创建新的
MemoryStream对象,确保每次操作都使用未被Dispose的流。 - 添加流状态前置检查:在读取流之前,先检查流的
CanRead属性,若返回false(已关闭/释放),则放弃当前流并重新初始化。 - 完善网络异常的资源清理:捕获网络中断引发的异常时,主动Dispose当前关联的流资源,并清理相关引用,防止后续重试时访问无效对象。
- 规避跨平台流桥接风险:在Android平台下,避免直接传递.NET流到Java桥接层,可先将流数据复制到临时缓冲区,再通过缓冲区构建新的流对象用于上传,减少跨平台资源管理冲突。
- 校验网络同步的生命周期:检查MAUI的网络状态监听逻辑,确保网络恢复时触发的同步操作是完整的新请求,而非复用之前中断请求的上下文资源。
内容的提问来源于stack exchange,提问作者Ericesar Ramirez
相关产品推荐
相关产品推荐

