diff --git a/smack-android-extensions/src/main/java/org/jivesoftware/smackx/ping/android/ServerPingWithAlarmManager.java b/smack-android-extensions/src/main/java/org/jivesoftware/smackx/ping/android/ServerPingWithAlarmManager.java index 2ac9458fb..fb6c8f4a7 100644 --- a/smack-android-extensions/src/main/java/org/jivesoftware/smackx/ping/android/ServerPingWithAlarmManager.java +++ b/smack-android-extensions/src/main/java/org/jivesoftware/smackx/ping/android/ServerPingWithAlarmManager.java @@ -27,6 +27,7 @@ import org.jivesoftware.smack.ConnectionCreationListener; import org.jivesoftware.smack.Manager; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPConnectionRegistry; +import org.jivesoftware.smack.util.Async; import org.jivesoftware.smackx.ping.PingManager; import android.app.AlarmManager; @@ -118,7 +119,21 @@ public class ServerPingWithAlarmManager extends Manager { if (ServerPingWithAlarmManager.getInstanceFor(connection).isEnabled()) { LOGGER.fine("Calling pingServerIfNecessary for connection " + connection.getConnectionCounter()); - PingManager.getInstanceFor(connection).pingServerIfNecessary(); + final PingManager pingManager = PingManager.getInstanceFor(connection); + // Android BroadcastReceivers have a timeout of 60 seconds. + // The connections reply timeout may be higher, which causes + // timeouts of the broadcast receiver and a subsequent ANR + // of the App of the broadcast receiver. We therefore need + // to call pingServerIfNecessary() in a new thread to avoid + // this. It could happen that the device gets back to sleep + // until the Thread runs, but that's a risk we are willing + // to take into account as it's unlikely. + Async.go(new Runnable() { + @Override + public void run() { + pingManager.pingServerIfNecessary(); + } + }, "PingServerIfNecessary (" + connection.getConnectionCounter() + ')'); } else { LOGGER.fine("NOT calling pingServerIfNecessary (disabled) on connection " + connection.getConnectionCounter()); diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/Async.java b/smack-core/src/main/java/org/jivesoftware/smack/util/Async.java index 1b4d57673..b6af0204f 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/util/Async.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/util/Async.java @@ -19,8 +19,19 @@ package org.jivesoftware.smack.util; public class Async { public static void go(Runnable runnable) { - Thread thread = new Thread(runnable); - thread.setDaemon(true); + Thread thread = daemonThreadFrom(runnable); thread.start(); } + + public static void go(Runnable runnable, String threadName) { + Thread thread = daemonThreadFrom(runnable); + thread.setName(threadName); + thread.start(); + } + + public static Thread daemonThreadFrom(Runnable runnable) { + Thread thread = new Thread(runnable); + thread.setDaemon(true); + return thread; + } }