diff --git a/src/Mono.Android/Android.Runtime/InputStreamInvoker.cs b/src/Mono.Android/Android.Runtime/InputStreamInvoker.cs index 232109d4416..fedd5ce2b2d 100644 --- a/src/Mono.Android/Android.Runtime/InputStreamInvoker.cs +++ b/src/Mono.Android/Android.Runtime/InputStreamInvoker.cs @@ -37,7 +37,9 @@ protected override void Dispose (bool disposing) if (disposing && BaseInputStream != null) { try { BaseFileChannel = null; - BaseInputStream.Close (); + if (BaseInputStream.PeerReference.IsValid) { + BaseInputStream.Close (); + } BaseInputStream.Dispose (); } catch (Java.IO.IOException ex) when (JNIEnv.ShouldWrapJavaException (ex)) { throw new IOException (ex.Message, ex); @@ -58,11 +60,7 @@ protected override void Dispose (bool disposing) // public override void Close () { - try { - BaseInputStream.Close (); - } catch (Java.IO.IOException ex) when (JNIEnv.ShouldWrapJavaException (ex)) { - throw new IOException (ex.Message, ex); - } + base.Close (); } public override void Flush () diff --git a/src/Mono.Android/Android.Runtime/OutputStreamInvoker.cs b/src/Mono.Android/Android.Runtime/OutputStreamInvoker.cs index c9985ee084c..4438b25804f 100644 --- a/src/Mono.Android/Android.Runtime/OutputStreamInvoker.cs +++ b/src/Mono.Android/Android.Runtime/OutputStreamInvoker.cs @@ -28,11 +28,7 @@ public OutputStreamInvoker (Java.IO.OutputStream stream) // public override void Close () { - try { - BaseOutputStream.Close (); - } catch (Java.IO.IOException ex) when (JNIEnv.ShouldWrapJavaException (ex)) { - throw new IOException (ex.Message, ex); - } + base.Close (); } // @@ -50,7 +46,9 @@ protected override void Dispose (bool disposing) { if (disposing && BaseOutputStream != null) { try { - BaseOutputStream.Close (); + if (BaseOutputStream.PeerReference.IsValid) { + BaseOutputStream.Close (); + } BaseOutputStream.Dispose (); } catch (Java.IO.IOException ex) when (JNIEnv.ShouldWrapJavaException (ex)) { throw new IOException (ex.Message, ex); diff --git a/tests/Mono.Android-Tests/Android.Runtime/InputStreamInvokerTest.cs b/tests/Mono.Android-Tests/Android.Runtime/InputStreamInvokerTest.cs index 6252b61ae41..cb91c704f12 100644 --- a/tests/Mono.Android-Tests/Android.Runtime/InputStreamInvokerTest.cs +++ b/tests/Mono.Android-Tests/Android.Runtime/InputStreamInvokerTest.cs @@ -12,6 +12,15 @@ namespace Android.RuntimeTests [TestFixture] public class InputStreamInvokerTest { + [Test] + public void Disposing_Shared_Data_Does_Not_Throw_IOE () + { + var javaInputStream = new Java.IO.ByteArrayInputStream (new byte[]{0x1, 0x2, 0x3, 0x4}); + var invoker = new InputStreamInvoker (javaInputStream); + javaInputStream.Dispose (); + invoker.Dispose (); + } + [Test] public void InputStreamTest () {