Android-Anwendung zum Einfrieren von Bluetooth-Sockets

9

Ich habe ein seltsames Problem mit der Bluetooth-Buchse. Wenn ich Socket erstellen und später Anwendung schließen, frieren Android-Gerät mit sehr hoher CPU-Auslastung.

Hier mein Beispielcode:

%Vor%

Obwohl ich Socket mit close() Methode schließe, verstehe ich nicht, warum Android-Gerät nach dem Schließen meiner App einfrieren. Bitte beachten Sie, dass nur Socket erstellt, aber nicht verbunden ist ...

BEARBEITEN:

OK, dort Beispielcode:

%Vor%

und log:

%Vor%

Wie Sie aus dem Protokoll sehen können, wurde Socket erfolgreich geschlossen. Beenden Sie jetzt die App (sie wird im Hintergrund ausgeführt), führen Sie den Task-Manager aus und beenden Sie die App. In diesem Moment wird Android-Gerät mit sehr hoher CPU-Auslastung einfrieren.

EDIT 2:

Ich habe festgestellt, dass dieses Problem nur auf dem Samsung GALAXY Tab Gerät reproduziert werden kann. Zum Beispiel kann ich es nicht mit meinem HTC Desire reproduzieren.

    
Alex Ivasyuv 10.12.2010, 11:21
quelle

7 Antworten

1

OK, es ist ein Samsung GALAXY Tab Bug, also warten Android Update ...

UPDATE: in neuer Firmware behoben!

    
Alex Ivasyuv 20.12.2010, 11:31
quelle
4

Eine Lösung, die ich gefunden habe (für einen Samsung Galaxy Mini) - das ist ziemlich unfreundlich für den Benutzer und nicht gut "Design" (aber der Broadcom Firmware-Bug ist sowieso nicht gut "Design") - aber es ist Besser als das Telefon einfrieren zu lassen - ist, das Bluetooth auszuschalten, nachdem wir fertig sind:

Sowohl in onDestroy () als auch onBackPressed () - rufe ich meine cleanup () -Funktion auf, die ungefähr so ​​aussieht:

%Vor%     
kasidit 14.10.2011 12:36
quelle
0

Wurde der Socket erfolgreich erstellt, bevor die Methode Close () aufgerufen wurde? Ich würde versuchen, den Socket auf Null vor dem Aufruf von CreateRfcommSocketToServiceRecord (UUID) zu initialisieren Das Bluetooth-Chat-Beispiel tut dies .. hier ist ein Ausschnitt.

%Vor%     
Dennis Mathews 13.12.2010 17:59
quelle
0

Sehen Sie sich den Code an, der cancel() aufruft. Sehen Sie sich insbesondere an, wie es Laufzeitausnahmen behandelt, die von cancel() ausgelöst werden. Der obige Code löst eine NPE aus, wenn cancel() aufgerufen wird, nachdem ConnectThread() eine Ausnahme abgefangen hat.

Überprüfen Sie auch alle Schleifen, in denen Sie eine Operation an socket ausführen. Sobald der close() aufgerufen wird, werden connect() , getInputStream() und getOutputStream() IOEs werfen.

    
Devon_C_Miller 13.12.2010 18:45
quelle
0

Haben Sie versucht, Traceview zu betrachten? Welche Methode blockiert die CPU? Das könnte Ihnen einige Einblicke in dieses Problem geben. Auch wenn dies nur auf einem bestimmten Gerät geschieht, sollten Sie in der Lage sein, mit traceview zu finden.

    
srinathhs 20.12.2010 04:11
quelle
0

Ich habe das gleiche Problem, aber im Server-Modus, wenn ich BluetoothServerSocket verwendet habe. Ich benutzte system.exit (0), um die Anwendung zu beenden, die ich irgendwo las, das nicht empfohlen wird. Ich habe den system.exit (0) -Aufruf entfernt und ich habe kein Freeze-Problem. (Aber wenn ich die App dann töte, zeigt es das Einfrieren).

Hat jemand ein Problem im Server-Modus, wenn manchmal der SDP-Datensatz nicht gelöscht wird?

    
EricG 06.01.2011 06:00
quelle
0

Obwohl ich nicht feststellen kann, wie ich dieses Problem tatsächlich verhindern kann, habe ich das gleiche Problem. Nach einigen Nachforschungen scheint es ein Problem mit dem Broadcom Bluetooth Stack zu geben. Um die Frage zu beantworten, welcher Prozess die CPU-Geisel hält, ist es btld.

Siehe meinen anderen Beitrag, den noch niemand beantwortet hat: Btld Ressourcen nach dem Beenden der Anwendung verbrauchen?

    
odhinn 07.07.2011 02:27
quelle