a quick note about wifilocks today. We have two locks today WIFI_MODE_FULL and WIFI_MODE_SCAN_ONLY.
The "full" lock thats used by default on a createWifiLock() keeps wifi up at all times but it does not control the driver level power optimizations that are done on devices. When screen goes off, drivers changes settings to reduce power usage on wifi. This can lead to wifi getting disconnected or the packet loss and delay increase when the screen is off. For application scenarios, where we need the best wifi performance at all times (a VoIP call in progress) as an example, we are going to add a new lock type that will disable the power optimizations in the driver (if the driver supports its). This will be out in the next release and can be used at times when wifi performance is criticial Thanks On Tue, Mar 1, 2011 at 6:37 AM, J <[email protected]> wrote: > Hi, friends, > > let's see if someone can help me. > > Summary: even when wifi lock is adquired, when the phone is running on > batteries, wifi is disconnected after a while. > > I've simplified the problem to a single activity with a button that > launches a thread. It just sends 100.000 strings to an echo server > running on a PC (one string every 100ms). See code below. I can see > the traffic with Wireshark, and also the echo server shows the > strings. Notice how wifi and power locks are adquired before starting > to send (and released after, of course). > > However, when the phone is running on battery and the user turns off > the phone, it keeps sending strings for some time and then wifi is > disconnected and the phone does not even respond to ping. It takes > from 600s to 6000s to be disconnected (the figures are that round, so > I think they are important). > > It perfectly works when ac is connected, so I guess it is somehow > related to power management. > > To test it I just launch the activity, start the echo server, start > Wireshark, press the "Start" button (android:onClick="doStart"), > blocks the phone and let it on the table. I go for lunch or whatever > and after 600-6000s I can see the tx errors on Wireshark, the echo > server has stopped receiving traffic and the phone does not respond to > ping. > > The phone is 2.2, with Wifi policy set to "sleep after 15m". > > > Any idea? > > > > > public class Test extends Activity { > PowerManager _powerManagement = null; > PowerManager.WakeLock _wakeLock = null; > WifiManager.WifiLock _wifiLock = null; > > /** Called when the activity is first created. */ > @Override > public void onCreate(Bundle savedInstanceState) { > super.onCreate(savedInstanceState); > setContentView(R.layout.main); > } > > public void doStart(View v) { > DoerThreadFake t = new DoerThreadFake(); > t.start(); > } > > private class DoerThreadFake extends Thread { > public void run() { > runOnUiThread(new Runnable() { > public void run() { > ((Button) findViewById(R.id.start)).setText("Doing..."); > } > }); > _keepOnStart(); > Socket s; > byte[] buffer = new byte[1000]; > > try { > s = new Socket("192.168.0.16", 2000); > PrintStream ps = new PrintStream(s.getOutputStream()); > InputStream is = s.getInputStream(); > for (int i = 0; i < 100000; i++) { > ps.println(System.currentTimeMillis() +"("+(new > Date()).toString() +") : " + i); > try { > Thread.sleep(100); > } catch (InterruptedException e) { > e.printStackTrace(); > } > while (is.available() > 0) { > int a = is.available(); > if (a > 1000) a = 1000; > is.read(buffer, 0, a); // Clean echo > } > } > } catch (UnknownHostException e) { > e.printStackTrace(); > } catch (IOException e) { > e.printStackTrace(); > } > _keepOnStop(); > runOnUiThread(new Runnable() { > public void run() { > ((Button) findViewById(R.id.start)).setText("Done"); > } > }); > } > > private void _keepOnStart() { > if (_powerManagement == null) { > _powerManagement = (PowerManager) > getSystemService(Context.POWER_SERVICE); > } > if (_wakeLock == null) { > _wakeLock = > _powerManagement.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | > PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, > "0 Backup power lock"); > } > _wakeLock.acquire(); > WifiManager wifiManager = (WifiManager) > getSystemService(Context.WIFI_SERVICE); > if (wifiManager != null) { > _wifiLock = wifiManager.createWifiLock("0 Backup wifi lock"); > _wifiLock.acquire(); > } > } > > private void _keepOnStop() { > if ((_wifiLock != null) && (_wifiLock.isHeld())) { > _wifiLock.release(); > } > if ((_wakeLock != null) && (_wakeLock.isHeld())) { > _wakeLock.release(); > } > } > } > } > > > > > <?xml version="1.0" encoding="utf-8"?> > <manifest > xmlns:android="http://schemas.android.com/apk/res/android" > package="Odroid.test" > android:versionCode="1" > android:versionName="1.0" > > > <uses-sdk android:minSdkVersion="4" /> > > <application > android:icon="@drawable/icon" > android:label="@string/app_name" > > > <activity > android:name=".Test" > android:label="@string/app_name" > > > <intent-filter> > <action > android:name="android.intent.action.MAIN" /> > <category > android:name="android.intent.category.LAUNCHER" /> > </intent-filter> > </activity> > > </application> > <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.WAKE_LOCK" /> > > </manifest> > > -- > You received this message because you are subscribed to the Google > Groups "Android Developers" group. > To post to this group, send email to [email protected] > To unsubscribe from this group, send email to > [email protected] > For more options, visit this group at > http://groups.google.com/group/android-developers?hl=en -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

