UI über Handler aktualisieren

  • Antworten:7
Philipp
  • Forum-Beiträge: 4

02.06.2014, 11:49:04 via Website

Hallo,

meine App verbindet sich per Bluetooth über einen Thread, der im Hintergrund läuft und anschließend auf eingehende Nachrichten wartet. Sobald eine bestimmte Nachricht empfangen wird, soll sich ein Bild in der MainActivity ändern. Das Ganze mache ich über einen Handler.

In der Verbindungs-Klasse:

private static BluetoothConnectionService bt;
private Handler mHandler;

private BluetoothConnectionService(Handler handler) {
        mHandler = handler;
    }

public static BluetoothConnectionService getVerbindungsService(Handler handler) {
        if (bt == null) {
            bt = new BluetoothConnectionService(handler);
        }
        return bt;
    }

if(...) {           
                Message msg = mHandler.obtainMessage(MainActivity.BILD_2);
                mHandler.sendMessage(msg);
            }

In der MainActivity:

bt = BluetoothConnectionService.getVerbindungsService(mHandler);


 public final Handler mHandler  = new Handler() {  
            public void handleMessage(Message msg) {
    switch (msg.what) {
                case BILD_2: imgView.setImageResource(R.raw.bild_2);
                                             imgView.invalidate();
                        Toast.makeText(getApplicationContext(),"Bild geaendert", Toast.LENGTH_LONG).show();
                                 }
    });
    break;

Dabei funktioniert es manchmal, dass sich das Bild ändert - allerdings nicht immer. Woran könnte das liegen? Auffällig ist, dass die Toast Nachricht auch dann angezeigt wird, wenn sich das Bild nicht ändert.

Antworten
Philipp
  • Forum-Beiträge: 4

02.06.2014, 13:25:39 via Website

Vielen Dank für die schnelle Antwort. Das sind nur die für das Problem relevanten Codestellen.

LogCat sagt, dass der case-Fall immer korrekt abgearbeitet wird. Lediglich der Befehl imgView.setImageResource(...) scheint wirkungslos zu bleiben. Eventuell muss auch nur richtig aktualisiert werden und imgView.invalidate() tut nicht das was es soll.

Ich habe es jetzt mit Hilfe von runOnUiThread versucht:

runOnUiThread(new Runnable() {
                        public void run() {
                            imgView.setImageResource(R.raw.bild_2);
                            imgView.invalidate();
                            Log.d("TEST", "image wechsel!!!!!!");
                        }
                    });

Damit hat es beim ersten Test funktioniert, beim zweiten wieder nicht mehr.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.06.2014, 13:24:05 via Website

Setzt mal einen Brakpoint aud die Stelle und pfüfe mit dem Debugger ob der da ein zweites mal überhaupt hinkommt
(Stimmt bekommst du 2 LogCat ausgaben?)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Philipp
  • Forum-Beiträge: 4

04.06.2014, 08:19:18 via Website

Mit zweitem Test meinte ich App beenden -> neu starten -> geht nicht mehr.
Es funktioniert entweder jedes Mal während der Ausführung der App oder überhaupt nicht.
Der Debugger kommt immer an diese Stelle. Auch wenn das Bild nicht geändert wird.
Mir ist jetzt aufgefallen, dass es funktioniert, wenn ich die App davor mit einem Appkiller geschlossen habe.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.06.2014, 18:01:43 via Website

Kann sein dass noch irgendwas im Hintergrund läuft (Thread, Service)?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Philipp
  • Forum-Beiträge: 4

06.06.2014, 13:34:18 via Website

Im Hintergrund läuft der Thread für die Bluetooth Verbindung, sonst nichts Anderes.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.06.2014, 14:26:17 via Website

Dann solltest du den Thread beenden wenn du die App beendest.
Sonst läuft dieser weiter acuh wenn die App nicht mehr läuft.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten