Ö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ı?
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 –
Ben HTC Desire HD aynı sorunla karşı karşıya am @Jevier size geçici çözümü açıklar mısınız – Imon
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. –