From 557a10664626975189cb05a2b5c139ca5b00d27c Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Sun, 21 Jan 2018 15:12:46 +0100 Subject: use countdownlatch to check if TagWriter has finished --- src/main/java/de/pixart/messenger/xml/TagWriter.java | 17 +++++++++++++---- .../java/de/pixart/messenger/xmpp/XmppConnection.java | 12 +----------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/main/java/de/pixart/messenger/xml/TagWriter.java b/src/main/java/de/pixart/messenger/xml/TagWriter.java index c6b84170d..53f04128f 100644 --- a/src/main/java/de/pixart/messenger/xml/TagWriter.java +++ b/src/main/java/de/pixart/messenger/xml/TagWriter.java @@ -5,7 +5,9 @@ import android.util.Log; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; import de.pixart.messenger.Config; import de.pixart.messenger.xmpp.stanzas.AbstractStanza; @@ -15,13 +17,15 @@ public class TagWriter { private OutputStreamWriter outputStream; private boolean finished = false; private LinkedBlockingQueue writeQueue = new LinkedBlockingQueue(); + private CountDownLatch stanzaWriterCountDownLatch = null; private Thread asyncStanzaWriter = new Thread() { @Override public void run() { + stanzaWriterCountDownLatch = new CountDownLatch(1); while (!isInterrupted()) { if (finished && writeQueue.size() == 0) { - return; + break; } try { AbstractStanza output = writeQueue.take(); @@ -30,9 +34,10 @@ public class TagWriter { outputStream.flush(); } } catch (Exception e) { - return; + break; } } + stanzaWriterCountDownLatch.countDown(); } }; @@ -94,8 +99,12 @@ public class TagWriter { this.finished = true; } - public boolean finished() { - return (this.writeQueue.size() == 0); + public boolean await(long timeout, TimeUnit timeunit) throws InterruptedException { + if (stanzaWriterCountDownLatch == null) { + return true; + } else { + return stanzaWriterCountDownLatch.await(timeout, timeunit); + } } public boolean isActive() { diff --git a/src/main/java/de/pixart/messenger/xmpp/XmppConnection.java b/src/main/java/de/pixart/messenger/xmpp/XmppConnection.java index b242cd568..4ee5a6a4e 100644 --- a/src/main/java/de/pixart/messenger/xmpp/XmppConnection.java +++ b/src/main/java/de/pixart/messenger/xmpp/XmppConnection.java @@ -1517,9 +1517,7 @@ public class XmppConnection implements Runnable { final Socket currentSocket = this.socket; final CountDownLatch streamCountDownLatch = this.mStreamCountDownLatch; try { - for (int i = 0; i <= 10 && !currentTagWriter.finished() && !currentSocket.isClosed(); ++i) { - Thread.sleep(100); - } + currentTagWriter.await(1, TimeUnit.SECONDS); Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": closing stream"); currentTagWriter.writeTag(Tag.end("stream:stream")); if (streamCountDownLatch != null) { @@ -1542,14 +1540,6 @@ public class XmppConnection implements Runnable { } } - private static void uninterruptedSleep(int time) { - try { - Thread.sleep(time); - } catch (InterruptedException e) { - //ignore - } - } - public void resetStreamId() { this.streamId = null; } -- cgit v1.2.3