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
This commit is contained in:
Hans-Christoph Steiner 2014-05-19 21:57:39 -04:00
parent f2994b0764
commit 30ecc1c9f6
2 changed files with 9 additions and 0 deletions

View File

@ -34,6 +34,7 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

View File

@ -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<Void, Void, Void>() {
@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);