2 ImageViews nacheinander befüllen, befüllt aber teilweise beide

AnnaBauer21

AnnaBauer21

Neues Mitglied
2
Hallo Leute,
ich habe ein kleines Problem mit zwei ImageViews.
Ich hoffe ihr könnt den Thread einigermaßen lesen, die Vorschau mag irgendwie keine Leerzeilen
thinking.png

Folgendes:
1. Ich bekomme über USB Daten und anhand bestimmter Bytes wird erkannt ob es sich um Bild Typ1 oder Bild Typ2 handelt
2. Die Daten werden in ein Array geschrieben und mit einem Hinweis (String), um welchen Typ es sich handelt, an einen Handler übergeben

Code:
//1. 
if (imgMatrix[byteCounter - 2] == 0x5A && imgMatrix[byteCounter - 1] == 0x71){ 
//2. 
DataPackage dataPkg = new DataPackage(); 
dataPkg.setPackageType("Typ1"); 
dataPkg.setImage(imgMatrix); 
Message m = Message.obtain(handler); 
m.obj = dataPkg; 
handler.sendMessage(m); 
} else if (imgMatrix[byteCounter - 2] == 0x5B && imgMatrix[byteCounter - 1] == 0x72){ 
//2. 
DataPackage dataPkg = new DataPackage(); 
dataPkg.setPackageType("Typ2"); 
dataPkg.setImage(imgMatrix); 
Message m = Message.obtain(handler); 
m.obj = dataPkg; 
handler.sendMessage(m); 
}


3. Im Handler wird ein Bitmap aus den übergebenen Daten erzeugt und an ein Fragment übergeben

Code:
private final Handler handler = new Handler() { 
@Override 
public void handleMessage(Message msg) { 
dataPkg = (DataPackage) msg.obj; 
bmp.setPixels(dataPkg.getImage(), 0, 800, 0, 0, 800, 600); 
if (dataPkg.getPackageType() == "Typ1") { 
fragment1.setBitmapTyp1(bmp); 
} else if (dataPkg.getPackageType() == "Typ2" ) { 
fragment1.setBitmapTyp2(bmp); 
} 
} 
};


4. Im Fragment wird dann in den Setter-Methoden das jeweilige ImageView mit dem Bild befüllt

Code:
public void setBitmapTyp1t(Bitmap bmp) { 
iView1.setImageBitmap(bmp); 
} 
public void setBitmapTyp2(Bitmap bmp) { 
iView2.setImageBitmap(bmp); 
}



Das komische ist, angenommen ich übergebe an den Handler 5 Bilder in folgender Reihenfolge (Typ1, Typ2, Typ2, Typ2, Typ1, Typ1):
  • Typ1 wird nur beim ImageView von Typ1 dargestellt
  • Typ2 wird bei beiden ImageViews von Typ1 und Typ2 dargestellt
  • Typ2 wird nu beim ImageView von Typ2 dargestellt
  • Typ2 wird nu beim ImageView von Typ2 dargestellt
  • Typ1 wird bei beiden ImageViews von Typ1 und Typ2 dargestellt
  • Typ1 wird nur beim ImageView von Typ1 dargestellt
Also wird immer wenn der Typ gewechselt wird das Bild bei beiden ImageViews dargestellt.

Aber warum ist das so?
Was ist an meinem Code falsch?

Hoffe ihr könnt mir helfen!

Viele Grüße
Anna
 
Zuletzt bearbeitet:
Der Grund könnten deine String-Vergleiche sein:

Code:
if (dataPkg.getPackageType() == "Typ1") { 
  fragment1.setBitmapTyp1(bmp); 
} else if (dataPkg.getPackageType() == "Typ2" ) { 
  fragment1.setBitmapTyp2(bmp); 
}

Es ist in den meisten Fällen eine schlechte Idee, Strings mit == zu vergleichen. Du vergleichst damit die Referenz, aber nicht den Wert der Strings. Normalerweise benutzt man dafür equals()

Code:
if ("Typ1".equals( dataPkg.getPackageType() )) { 
  fragment1.setBitmapTyp1(bmp); 
} else if ("Typ2".equals( dataPkg.getPackageType() )) { 
  fragment1.setBitmapTyp2(bmp); 
}
 
Zoopa, gut erkannt! :thumbsup:
 
Hallo Leute,

danke für die schnelle Antwort :smile:

equals hat aber leider keinen Unterschied gebracht!

Viele Grüße
Anna
 
Was mir an deinem Beispiel noch auffällt: Der Fehler scheint immer dann aufzutreten, wenn der Typ des Bildes ändert. Also wenn z.B. das vorherige Bild vom Typ1 war und das jetzige vom Typ2 (oder umgekehrt). Wenn der Typ gleich bleibt, tritt der Fehler laut deinem Beispiel nicht auf.

Vielleicht wird bei einem Typ-Wechsel aus irgend einem Grund die Referenz auf das vorherige Bild überschrieben und beide ImageViews verweisen dann auf dieselbe Referenz.

Ein paar Dinge fallen mir an deinem Code bei genauerem Hinsehen noch auf:

Du hast zwei mal einen Handler mit demselben Namen:

Code:
Handler handler = new Handler(); 

private final Handler handler = new Handler() {...}

Es könnte also sein, dass es da Probleme gibt, weil der eine Handler den anderen verdeckt und du den falschen ansprichst. Das kann man anhand deiner Codebeispiele nicht so direkt beurteilen.

Ausserdem hast du im unteren Handler in der Methode handleMessage() die folgenden Zeilen:

Code:
dataPkg = (DataPackage) msg.obj; 

bmp.setPixels(dataPkg.getImage(), 0, 800, 0, 0, 800, 600);

Daraus schliesse ich, dass die Variable dataPkg und bmp ausserhalb des Handlers deklariert ist. Auch hier könnte es vielleicht irgendwo wieder zu einem Missverständnis gekommen sein, weil du an anderen Orten den gleichen Namen ebenfalls verwendest. Vielleicht wird bmp zum falschen Zeitpunkt oder unerwartet überschrieben.

Sind alles nur Vermutungen :thumbup: Du kannst ja in Eclipse mal Breakpoints setzen und genauer schauen, wann sich welche Variablen / Referenzen ändern.
 
Hallo Zoopa,

das mit dem Handler ist ein Fehler in meinem Beispiel tut mir leid!
Die 1. Angabe gibt es nicht, habe ich auch gleich aus meinem Thread entfernt!

Ich habe dataPkg und bmp nun im Handler deklariert, und siehe da...
ES GEHT!!!!!!!!!!! :thumbsup:

Vielen Vielen Dank!

Aber hierzu habe ich noch eine Frage:
Durch bpm.setPixels(...) werden doch alle Pixel der Bitmap durch die angegebenen ersetzt. Und durch dataPkg = (DataPackage) msg.obj wird das aktuelle Objekt von DataPackage überschrieben.
Warum funktioniert es, wenn ich beides im Handler jedes mal neu erstelle?

Sollte bei meinem Code nicht beides mit den neuen Daten überschrieben werden? :confused2:

Viele Grüße
Anna :smile:
 
Zuletzt bearbeitet:

Ähnliche Themen

R
  • RalfKahl
Antworten
4
Aufrufe
185
RalfKahl
R
A
  • Gesperrt
  • AGWInternational
Antworten
8
Aufrufe
951
swa00
swa00
Zurück
Oben Unten