diff --git a/modules/juce_core/native/java/JuceAppActivity.java b/modules/juce_core/native/java/JuceAppActivity.java index ee32b4947b..53c3ff0644 100644 --- a/modules/juce_core/native/java/JuceAppActivity.java +++ b/modules/juce_core/native/java/JuceAppActivity.java @@ -949,36 +949,30 @@ public class JuceAppActivity extends Activity public final boolean connect() { - try + synchronized (createStreamLock) { + if (hasBeenCancelled.get()) + return false; + try { - synchronized (createStreamLock) + try { - if (hasBeenCancelled.get()) - return false; - inputStream = getCancellableStream (true); } - } - catch (ExecutionException e) - { - if (connection.getResponseCode() < 400) + catch (ExecutionException e) + { + if (connection.getResponseCode() < 400) + { + statusCode[0] = connection.getResponseCode(); + connection.disconnect(); + return false; + } + } + finally { statusCode[0] = connection.getResponseCode(); - connection.disconnect(); - return false; } - } - finally - { - statusCode[0] = connection.getResponseCode(); - } - - synchronized (createStreamLock) - { - if (hasBeenCancelled.get()) - return false; try { @@ -989,49 +983,89 @@ public class JuceAppActivity extends Activity } catch (ExecutionException e) {} + + for (java.util.Map.Entry> entry : connection.getHeaderFields().entrySet()) + if (entry.getKey() != null && entry.getValue() != null) + responseHeaders.append (entry.getKey() + ": " + + android.text.TextUtils.join (",", entry.getValue()) + "\n"); + + return true; + } + catch (IOException e) + { + return false; } - - for (java.util.Map.Entry> entry : connection.getHeaderFields().entrySet()) - if (entry.getKey() != null && entry.getValue() != null) - responseHeaders.append (entry.getKey() + ": " - + android.text.TextUtils.join (",", entry.getValue()) + "\n"); - - return true; } - catch (IOException e) + } + + static class DisconnectionRunnable implements Runnable + { + public DisconnectionRunnable (HttpURLConnection theConnection, + InputStream theInputStream, + ReentrantLock theCreateStreamLock, + Object theCreateFutureLock, + Future theStreamFuture) { - return false; + connectionToDisconnect = theConnection; + inputStream = theInputStream; + createStreamLock = theCreateStreamLock; + createFutureLock = theCreateFutureLock; + streamFuture = theStreamFuture; } + + public void run() + { + try + { + if (! createStreamLock.tryLock()) + { + synchronized (createFutureLock) + { + if (streamFuture != null) + streamFuture.cancel (true); + } + + createStreamLock.lock(); + } + + if (connectionToDisconnect != null) + connectionToDisconnect.disconnect(); + + if (inputStream != null) + inputStream.close(); + } + catch (IOException e) + {} + finally + { + createStreamLock.unlock(); + } + } + + private HttpURLConnection connectionToDisconnect; + private InputStream inputStream; + private ReentrantLock createStreamLock; + private Object createFutureLock; + Future streamFuture; } public final void release() { - hasBeenCancelled.set (true); + DisconnectionRunnable disconnectionRunnable = new DisconnectionRunnable (connection, + inputStream, + createStreamLock, + createFutureLock, + streamFuture); - try + synchronized (createStreamLock) { - if (! createStreamLock.tryLock()) - { - synchronized (createFutureLock) - { - if (streamFuture != null) - streamFuture.cancel (true); - } + hasBeenCancelled.set (true); - createStreamLock.lock(); - } - - if (inputStream != null) - inputStream.close(); - } - catch (IOException e) - {} - finally - { - createStreamLock.unlock(); + connection = null; } - connection.disconnect(); + Thread disconnectionThread = new Thread(disconnectionRunnable); + disconnectionThread.start(); } public final int read (byte[] buffer, int numBytes) diff --git a/modules/juce_core/native/juce_android_Network.cpp b/modules/juce_core/native/juce_android_Network.cpp index 76b3780a44..2cb1a96e41 100644 --- a/modules/juce_core/native/juce_android_Network.cpp +++ b/modules/juce_core/native/juce_android_Network.cpp @@ -201,6 +201,8 @@ public: { jassert (buffer != nullptr && bytesToRead >= 0); + const ScopedLock lock (createStreamLock); + if (stream == nullptr) return 0;