From 30ecc1c9f6d7c26ec8600e53e1f89c4430ea5982 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 19 May 2014 21:57:39 -0400 Subject: [PATCH] use MulticastLock for better Bonjour/mDNS performance Multicast transmission is subject to heavy power management on Android, because it apparently can be a battery drain. mDNS/Bonjour is based entirely on multicast, so in order to have good Bonjour performance, there needs to be good multicast performance. MulticastLock provides that. fixes #3381 https://dev.guardianproject.info/issues/3381 --- AndroidManifest.xml | 1 + src/org/fdroid/fdroid/net/MDnsHelper.java | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 13d8b590d..0c1ecc827 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -34,6 +34,7 @@ + diff --git a/src/org/fdroid/fdroid/net/MDnsHelper.java b/src/org/fdroid/fdroid/net/MDnsHelper.java index 48e2bc853..30a1305a6 100644 --- a/src/org/fdroid/fdroid/net/MDnsHelper.java +++ b/src/org/fdroid/fdroid/net/MDnsHelper.java @@ -3,6 +3,8 @@ package org.fdroid.fdroid.net; import android.app.Activity; import android.content.Context; +import android.net.wifi.WifiManager; +import android.net.wifi.WifiManager.MulticastLock; import android.os.AsyncTask; import android.os.Handler; import android.os.Looper; @@ -32,10 +34,14 @@ public class MDnsHelper implements ServiceListener { final RepoScanListAdapter mAdapter; private JmDNS mJmdns; + private MulticastLock mMulticastLock; public MDnsHelper(Activity activity, final RepoScanListAdapter adapter) { mActivity = activity; mAdapter = adapter; + WifiManager wm = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE); + mMulticastLock = wm.createMulticastLock(activity.getPackageName()); + mMulticastLock.setReferenceCounted(false); } @Override @@ -75,6 +81,7 @@ public class MDnsHelper implements ServiceListener { } public void discoverServices() { + mMulticastLock.acquire(); new AsyncTask() { @Override @@ -98,6 +105,7 @@ public class MDnsHelper implements ServiceListener { } public void stopDiscovery() { + mMulticastLock.release(); if (mJmdns == null) return; mJmdns.removeServiceListener(HTTP_SERVICE_TYPE, MDnsHelper.this);