2011-02-28 37 views
19

Özet: wifi kilidi alındığında bile, telefon pille çalışırken, bir süre sonra WiFi bağlantısı kesilir.Wifi, Lock ile kilitleniyor

Bir iş parçacığı başlatan bir düğme ile tek bir etkinlik sorunu basitleştirdik. Sadece bir PC'de çalışan bir eko sunucusuna 100.000 dizge gönderir (her 100 ms'de bir dizi). Aşağıdaki kodlara bakın. WireShark ile trafiği görebilirim ve eko sunucusu dizeleri gösterir. Gönderilmeye başlamadan önce WiFi ve güç kilitlerinin nasıl alındığına dikkat edin (ve tabiki sonra serbest bırakın). telefon pille çalışırken ve kullanıcı telefonunu kapandığında

Ancak, bir süre dizeleri gönderme tutar ve daha sonra WiFi bağlantısı kesildi ve telefon bile ping yanıt vermez. Bağlantının kesilmesi 600'lerden 6000 saniyeye kadar sürüyor (rakamlar bu kadar yuvarlak, bu yüzden önemli olduklarını düşünüyorum).

A/C bağlıyken Mükemmel çalışıyor, bu yüzden bir türlü güç yönetimiyle ilgili sanırım.

Test etmek için etkinliği başlatıyorum, echo sunucusunu başlatıyorum, WireShark'ı başlatın, "Başlat" düğmesine (android:onClick="doStart") basın, telefonu engeller ve masaya bırakın. Öğle yemeğine gidiyorum ya da 600-6000'den sonra TelShark'taki tx hatalarını görebiliyorum, yankı sunucusu trafiği durdurdu ve telefon ping'e cevap vermiyor.

telefon "15m sonra uyku" olarak ayarlanmış WiFi politikası ile, 2.2 olduğunu.

package Odroid.test; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.PrintStream; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.Date; 

import android.app.Activity; 
import android.content.Context; 
import android.net.wifi.WifiManager; 
import android.os.Bundle; 
import android.os.PowerManager; 
import android.view.View; 
import android.widget.Button; 

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(); 
     } 
    } 
    } 
} 

tezahür:

<?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> 

fikrin var mı?

cevap

11

Wifi uyku/güç tasarruf moduna ile ilgisi Android hata izci sayısız böcek ve hatta mevcut bunun düzeltilmesi için bu girişimi uygulamadan oluşmaktadır. Bu yüzden yanlış bir şey yapmamanız muhtemeldir. http://code.google.com/p/android/issues/detail?id=1698

http://code.google.com/p/android/issues/detail?id=9781

Ayrıca hayatta

http://wififixer.wordpress.com/

+2

Teşekkür bağlantısını tutmak için kod size yardımcı olabilecek bir açık kaynak projesi olan wififixer göz atın. Bağlantılarınızı ve daha derinleri taramanızın ardından, HTC cihazlarının yanlış davranması daha olasıdır. Bu benim durumumdur (HTC arzusu). Sorun, düşük seviyeli kodda, HTC WiFi sürücüsünde ya da benzeriyse, kokuyor. :-(ben bir çözüm kullandım –

+0

Ben HTC Desire HD aynı sorunla karşı karşıya am @Jevier size geçici çözümü açıklar mısınız – Imon

+0

Imon (üzgünüm, ben şimdiye kadar yorum görmedim), gerçekten basit:..? Eğer cihaz pille çalışır, yürütmeyi iptal eder.Uygulamam için kabul edilebilir, ancak başkaları için yeterli olmayabilir. –