सारांश के साथ भी: जब वाईफाई लॉक अधिग्रहण किया जाता है, तब भी जब बैटरी बैटरी पर चल रहा है, वाईफ़ाई थोड़ी देर बाद डिस्कनेक्ट हो जाता है।वाईफ़ाई सोता है, लॉक
मैंने एक थ्रेड लॉन्च करने वाले बटन के साथ एक ही गतिविधि में समस्या को सरल बना दिया है। यह सिर्फ एक पीसी पर चल रहे एक गूंज सर्वर पर 100,000 स्ट्रिंग भेजता है (प्रत्येक 100ms एक स्ट्रिंग)। नीचे कोड देखें। मैं वायरशर्क के साथ यातायात देख सकता हूं, और गूंज सर्वर स्ट्रिंग दिखाता है। ध्यान दें कि भेजने के लिए शुरू करने से पहले वाईफाई और पावर लॉक कैसे अधिग्रहित किए जाते हैं (और निश्चित रूप से जारी किए जाते हैं)।
हालांकि, जब फोन बैटरी पर चल रहा है और उपयोगकर्ता फोन बंद कर देता है, तो यह कुछ समय के लिए स्ट्रिंग भेजता रहता है और फिर वाईफाई डिस्कनेक्ट हो जाता है और फोन पिंग का जवाब भी नहीं देता है। डिस्कनेक्ट होने के लिए 600 से 6000 तक लगते हैं (आंकड़े उस दौर हैं, इसलिए मुझे लगता है कि वे महत्वपूर्ण हैं)।
ए/सी कनेक्ट होने पर यह पूरी तरह से काम करता है, इसलिए मुझे लगता है कि यह किसी भी तरह से बिजली प्रबंधन से संबंधित है।
इसका परीक्षण करने के लिए मैं सिर्फ गतिविधि लॉन्च करता हूं, इको सर्वर शुरू करता हूं, वायरशर्क शुरू करता हूं, "स्टार्ट" बटन दबाता हूं (android:onClick="doStart"
), फोन को ब्लॉक करता है और उसे टेबल पर देता है। मैं दोपहर के भोजन के लिए जाता हूं या जो भी और 600-6000 के बाद मैं वायरशर्क पर टीएक्स त्रुटियों को देख सकता हूं, गूंज सर्वर ने यातायात प्राप्त करना बंद कर दिया है और फोन पिंग का जवाब नहीं देता है।
फ़ोन 2.2 है, वाईफ़ाई नीति "15 मीटर के बाद सोने" के साथ सेट है।
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();
}
}
}
}
प्रकट:
<?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>
किसी भी विचार?
धन्यवाद है की जाँच करें। आपके लिंक और गहन ब्राउज़िंग के बाद, ऐसा लगता है कि एचटीसी डिवाइस गलत तरीके से व्यवहार करने की अधिक संभावना है ... जो मेरा मामला है (एचटीसी इच्छा)। यह गंध करता है जैसे समस्या निम्न स्तर कोड में थी, शायद एचटीसी वाईफाई ड्राइवर में या तो। :-(मैंने एक वर्कअराउंड का उपयोग किया है। –
मुझे एचटीसी डिजायर एचडी पर एक ही समस्या का सामना करना पड़ रहा है। @ जेवियर क्या आप कृपया अपने कामकाज की व्याख्या करेंगे? – Imon
इमॉन (क्षमा करें, मुझे अभी तक टिप्पणी नहीं मिली), वास्तव में सरल: अगर डिवाइस बैटरी पर है, निष्पादन को रोक दें। यह मेरे आवेदन के लिए स्वीकार्य है, लेकिन हो सकता है कि दूसरों के लिए पर्याप्त न हो .-( –