diff --git a/src/main/java/eu/siacs/conversations/xml/TagWriter.java b/src/main/java/eu/siacs/conversations/xml/TagWriter.java index ddb1024c8..3dd02f6e8 100644 --- a/src/main/java/eu/siacs/conversations/xml/TagWriter.java +++ b/src/main/java/eu/siacs/conversations/xml/TagWriter.java @@ -13,15 +13,15 @@ import eu.siacs.conversations.xmpp.stanzas.AbstractStanza; public class TagWriter { private OutputStreamWriter outputStream; - private boolean finshed = false; + private boolean finished = false; private LinkedBlockingQueue writeQueue = new LinkedBlockingQueue(); + private Thread asyncStanzaWriter = new Thread() { - private boolean shouldStop = false; @Override public void run() { - while (!shouldStop) { - if ((finshed) && (writeQueue.size() == 0)) { + while (!isInterrupted()) { + if (finished && writeQueue.size() == 0) { return; } try { @@ -29,7 +29,7 @@ public class TagWriter { outputStream.write(output.toString()); outputStream.flush(); } catch (Exception e) { - shouldStop = true; + return; } } } @@ -73,7 +73,7 @@ public class TagWriter { } public TagWriter writeStanzaAsync(AbstractStanza stanza) { - if (finshed) { + if (finished) { Log.d(Config.LOGTAG,"attempting to write stanza to finished TagWriter"); return this; } else { @@ -90,7 +90,7 @@ public class TagWriter { } public void finish() { - this.finshed = true; + this.finished = true; } public boolean finished() { @@ -102,7 +102,7 @@ public class TagWriter { } public synchronized void forceClose() { - finish(); + asyncStanzaWriter.interrupt(); if (outputStream != null) { try { outputStream.close(); diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index 46fe15fc3..a55147e4b 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -219,6 +219,7 @@ public class XmppConnection implements Runnable { protected synchronized void changeStatus(final Account.State nextStatus) { if (Thread.currentThread().isInterrupted()) { Log.d(Config.LOGTAG,account.getJid().toBareJid()+": not changing status to "+nextStatus+" because thread was interrupted"); + return; } if (account.getStatus() != nextStatus) { if ((nextStatus == Account.State.OFFLINE) @@ -454,7 +455,7 @@ public class XmppConnection implements Runnable { * Starts xmpp protocol, call after connecting to socket * @return true if server returns with valid xmpp, false otherwise */ - private boolean startXmpp(Socket socket) throws Exception { + private synchronized boolean startXmpp(Socket socket) throws Exception { if (Thread.currentThread().isInterrupted()) { throw new InterruptedException(); }