Java Android - Abarbeitungsreihenfolge falsch

Jeak

Lt. Junior Grade
Registriert
Sep. 2007
Beiträge
372
Hey!

Habe im Moment ein Problem, das mich total verwirrt:

Im folgenden Code lasse ich beim Klick auf einen Button eine Bluetooth-Verbindung zu meinem Arduino aufbauen, damit ich diesem danach Befehle senden kann.

Funktioniert alles super.

Nun wollte ich einen ProgressDialog einblenden lassen, solange die Verbindung aufgebaut wird. (zur Veranschaulichung habe ich hierfür im Code einfach mal ein Label ändern lassen)

Wenn ich die App nun starte, führt es seltsamerweise die Befehle in falscher Reihenfolge aus. Und zwar wird, sobald ich auf den Button drücke, die Verbindung aufgebaut und dann "ende" angezeigt.

Durch Test habe ich herausgefunden, dass die Zeile
Code:
 textView1.setText("start");
einfach erst nach dem try-Block ausgeführt wird. Und sofort danach dann eben
Code:
textView1.setText("ende");
, sodass ich "start" gar nicht erst sehe.



Code:
...

switch2.setOnClickListener(new OnClickListener() {

	public void onClick(View v) {

		textView1.setText("start");

		findBT();

		try {

			openBT();

		} catch (IOException ex) {

		}

		textView1.setText("ende");

	}

});

...

	void findBT() {
		mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
		if (mBluetoothAdapter == null) {

		}

		if (!mBluetoothAdapter.isEnabled()) {
			Intent enableBluetooth = new Intent(
					BluetoothAdapter.ACTION_REQUEST_ENABLE);
			startActivityForResult(enableBluetooth, 0);

		}

		Set<BluetoothDevice> pairedDevices = mBluetoothAdapter
				.getBondedDevices();
		if (pairedDevices.size() > 0) {
			for (BluetoothDevice device : pairedDevices) {
				if (device.getName().equals("linvor")) {
					mmDevice = device;
					break;
				}
			}
		};
	}

	void openBT() throws IOException {
		UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
		mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
		mmSocket.connect();
		mmOutputStream = mmSocket.getOutputStream();
		mmInputStream = mmSocket.getInputStream();
	}

...

Würde mich riesig freuen, wenn mir jemand erklären könnte, wieso das der Fall ist und wie ich es hin bekomme, dass mein Smartphone die Zeilen in der richtigen Reihenfolge ausführt ;-) Hoffe, die Infos reichen hierzu.
 
Zwei Vermutungen:

1. Der Verbindungsaufbau geht so schnell, dass Android gar nicht genug Zeit hat "start" anzuzeigen.

2. Du fängst zwar in dem try-catch Block die IOException ab, lässt dir aber den Stacktrace nicht ausgeben (Du siehst also nicht ob eine Exception kam). Kanns vielleicht sein, dass da sofort eine Exception kommt? Dann würde sich das Verhalten wieder mit 1. erklären lassen. Du erreichst das textView1.setText("ende"); so schnell, dass dir "start" einfach nicht angezeigt wird.
 
Du verwendest keinen eigenen Thread dafür? Komisch, dass der Bluetooth-Kram dann trotzdem in einem eigenen Thread zu laufen scheint?

Ich habe das zwar noch nicht benutzt, aber ein kurzer Blick ins Handbuch zeigt, dass man auf jeden Fall einen eigenen Thread benutzen sollte und nicht den UI-Thread.
Schau mal in die Beispiele unter http://developer.android.com/guide/topics/connectivity/bluetooth.html#TheBasics
 
Meine Vermutung:
Vielleicht stößt der connect() in openBT() nur einen Hintergrund-Thread an und geht sofort weiter.
Ich denke mal, dass du anschließend in einer Schleife abfragen musst, ob die Verbindung aufgebaut wurde.

Und füge Code im catch-Block ein. Vielleicht springt er da rein.
 
@NiThDi: Nein, daran liegt es nicht. Bis die Verbindung zum Arduino steht, vergeht ca. 1 Sekunde. Zudem funktioniert der Verbindungsaufbau ja auch :-)

@Troublegum: Das ganze in einem eigen Thread laufen zu lassen ist sicher sinvoll. Werde ich auch noch tun. Aber wieso er dann "start" erst danach ausgibt verstehe ich trotzdem nicht.

@wahli: Verstehe leider nicht, was das in meinem Fall bringt. Könntest du nochmal erklären, was genau du bezwecken willst?
 
Was denn nun? Erst sagst du, du siehst nur "ende" und "start" überhaupt nicht (was sinn macht, weil die Verbindung in einem Hintergrund-Thread läuft)? Und nun sagst du du siehst "ende" und danach "start"?

@Jeak: wahli versucht dir das gleiche zu sagen wie ich dir auch. Die Bluetooth Verbindung scheint nicht im UI-Thread zu laufen.
 
Wenn ich folgenden Code nehme, sehe ich nach dem Verbindungsaufbau (erst danach!) "start":

Code:
...
 
switch2.setOnClickListener(new OnClickListener() {
 
public void onClick(View v) {
 
textView1.setText("start");
 
findBT();
 
try {
 
openBT();
 
} catch (IOException ex) {
 
}
 
}
 
});
 
...

Das passt doch dann nicht mehr zu eurer Theorie, oder?

edit: werde jetzt auf jeden Fall erst mal alles in einen Thread auslagern.
Ergänzung ()

Jetzt sehe ich nur noch "start" und die Verbindung wird korrekt aufgebaut. "ende" erscheint aber nie...?

Code:
textView1.setText("start");

new Thread() {

	public void run() {

		findBT();
		try {

			openBT();

		} catch (IOException ex) {

		}

	}

}.start();
					
textView1.setText("ende");
 
Zuletzt bearbeitet:
Jeak schrieb:
Wenn ich folgenden Code nehme, sehe ich nach dem Verbindungsaufbau (erst danach!) "start":
Weil du den Dispatcher-Thread blockierst. Erst wenn deine Methode zu Ende ist, gibst du diesen frei und er kann das Label aktualisieren.

Jeak schrieb:
Jetzt sehe ich nur noch "start" und die Verbindung wird korrekt aufgebaut. "ende" erscheint aber nie...?
Seltsam. Kann ich mir nur so vorstellen, dass zwischen "start" und "ende" eine Exception geworfen wird. Eigentlich solltest du nur "ende" und nie "start" sehen, wegen dem oben genannten Problem. Pack' mal alles in der onClick-Methode in einen try-catch block und schreibe evtl. auftretende Fehler in dein Label.
 
Danke! Der erste Hinweis war Gold wert!! :-)

Nachdem ich endlich verstanden habe, wieso der Code nicht sofort ausgeführt wird, war die Fehlerbehebung recht schnell gemacht.

Jetzt läuft es so, wie es soll.
 

Ähnliche Themen

Zurück
Oben