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.
OK, es ist ein Samsung GALAXY Tab Bug, also warten Android Update ...
UPDATE: in neuer Firmware behoben!
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%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% 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.
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?
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?