Android-Prozedur: Senden von 8 verschiedenen Nachrichten: handler findet 8 Nachrichten, sondern nur die Letzte Nachricht
Ich bin neu auf Android und fand heraus, dass immer die Aktualisierung der Hauptansicht ich hatte zum erstellen eines thread zu behandeln verschiedene Prozess-und übergeben Sie dann wieder updates zu den wichtigsten anzeigen. Ich habe mich für die Handler-Klasse, um dies zu tun. Die Ansicht in diesem Beispiel wird eine Schaltfläche zum aktivieren der code und ein tablelayout zur Anzeige der empfangenen Nachrichten - Darstellung einer Stufe des Prozesses.
Das problem ist, dass ich senden 8 verschiedene Meldungen und ich kann sehen, 8-Nachrichten kommen zurück in der Prozedur, aber alle 8 haben den gleichen Inhalt wie die Meldung nur 8.
Erwartete ich den handler um die Nachrichten in der Reihenfolge.
Irgendwelche Vorschläge auf eine bessere Weise, dies zu tun, immer willkommen, um zu lernen.
Hier ist der code:
`
public class messageHandlerTest extends Activity {
protected TextView textView;
protected Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
String[] status = (String[]) msg.obj;
createTableRow(status);
Log.e("Got a new message",status[0]+":"+status[1]);
}
};
Button btnStartProgress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.statusText);
textView.setText("");
//Getting response from server with Network SSID and Password
Button connectButton = (Button)findViewById(R.id.connectButton);
addListenerOnButton();
} //End of create
protected class connectWiFi extends Thread implements Runnable {
//tokens1 = new String[0];
public void run(){
try {
String[] messageString = new String[2];
Message message = handler.obtainMessage();
messageString[0]="OK";
messageString[1]="Number 1";
message.obj = messageString;
handler.sendMessage(message);
message = handler.obtainMessage();
messageString[0]="OK";
messageString[1]= "Number 2";
message.obj = messageString;
handler.sendMessage(message);
message = handler.obtainMessage();
messageString[0]="OK";
messageString[1] = "Number 3";
message.obj = messageString;
handler.sendMessage(message);
message = handler.obtainMessage();
messageString[0]="OK";
messageString[1] = "Number 4";
message.obj = messageString;
handler.sendMessage(message);
message = handler.obtainMessage();
messageString[0] = "OK";
messageString[1] = "Number 5";
message.obj = messageString;
handler.sendMessage(message);
message = handler.obtainMessage();
messageString[0] = "OK";
messageString[1] = "Number 6";
message.obj = messageString;
handler.sendMessage(message);
message = handler.obtainMessage();
messageString[0] = "OK";
messageString[1] = "Number 7";
message.obj = messageString;
handler.sendMessage(message);
message = handler.obtainMessage();
messageString[0] = "OK";
messageString[1] = "Number 8";
message.obj = messageString;
handler.sendMessage(message);
} catch (Exception e) {
e.printStackTrace();
Log.e("Exception found","bugger");
}
}//End or run
}//End of class
public void addListenerOnButton() {
btnStartProgress = (Button) findViewById(R.id.connectButton);
btnStartProgress.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
connectWiFi connectwifi = new connectWiFi();
connectwifi.start();
}
});
}
private void createTableRow(String[] stage) {
TableLayout tl = (TableLayout) findViewById(R.id.statusTable);
TableRow tr = new TableRow(this);
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
tr.setLayoutParams(lp);
tr.setBackgroundColor(0xFFFFFFFF);
TextView tvStatus = new TextView(this);
tvStatus.setLayoutParams(lp);
tvStatus.setPadding(2,1,1,2);
tvStatus.setTextColor(0xFF000000);
tvStatus.setText(stage[0]); //Status
TextView tvStage = new TextView(this);
tvStage.setLayoutParams(lp);
tvStage.setPadding(2,1,1,2);
tvStage.setTextColor(0xFF000000);
tvStage.setText(stage[1]); //Stage
tr.addView(tvStatus);
tr.addView(tvStage);
tl.addView(tr, new TableLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
Das Ergebnis dieses Codes sieht wie folgt aus:
Log.e("Got a new message",status[0]+":"+status[1]);
geben Sie die richtige Werte?Log.e liefert das gleiche Ergebnis, wie der Blick also alle 8!
Ich habe diesen code als ein Beispiel von hier: madskool.wordpress.com/2010/09/12/...
Das Beispiel, das ich verwendet wurde, war die 3. eins unten... alle Hilfe dankbar
InformationsquelleAutor ZipNFC | 2013-08-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, was geschieht, ist, dass Sie sich ständig ändern, die die gleiche Referenz String[] Namen messageString, während nie eine neue erstellen. Übergabe per Referenz und dann weiter um die Werte zu ändern gibt es wohl auch, was ist, was zu diesem Ergebnis.
Ein paar Dinge,
Keine chance zu erklären, warum die Verlängerung Thread und Implementierung von Runnable ist so eine schlechte Sache. Wenn ich nicht haben, Laufen in der Klasse funktioniert es nicht? Aber wieder einmal schaue ich in deinen blog - vielen Dank für Ihre Hilfe.
OK - keine Sorge, entfernt die Runnable implementieren und funktioniert gut - also nochmals vielen Dank.
Was JanBo gemeint war: Sie tun sollten, entweder einer von denen. Entweder verlängern
Thread
oder implementierenRunnable
. Beides gleichzeitig ist nicht erforderlich.Danke @Vikram - ein schönes Wochenende allen - zurück in die coding-Schule für mich. Cheers.
InformationsquelleAutor Andrew G
Für das senden von Daten über handler die Sie verwenden können, bündeln die Daten von message-Objekt, das Sie senden möchten handler. Wie dieser code :
InformationsquelleAutor Ali Mehrpour
Ich nehme an, was geschieht, ist, dass:
messageString
, die Sie erstellen nur einmal aktualisiert wird, währendmessage
wartet in der Warteschlange. Ändern Sie Ihren code wie folgt:Sie sind herzlich willkommen. Bitte machen Sie es eine Gewohnheit, die Annahme Antworten, dass Sie finden, geeignet. Haben ein gutes Wochenende.
InformationsquelleAutor Vikram
Ich bin nicht sicher, ob ich Tue dies in der richtigen Stelle, aber ich dachte, ich würde post wieder meine umgestalteten code basiert auf der Hilfe, die ich hier hatte, und es könnte jemand anderes helfen. Dies funktioniert gut für mich und der code sieht ganz ordentlich, aber jegliches feedback auf, wie dieser verbessert werden kann oder effizienter gemacht würde immer geschätzt werden. Auch lassen Sie mich wissen, wenn ich Tue dies am falschen Ort!
}
InformationsquelleAutor ZipNFC
versuchen, diese
nicht
Er bedeutete Nachricht.bekommen (), aber das alles tut, ist schnappen Sie sich eine Message-Instanz, ohne das Ziel gesetzt,
InformationsquelleAutor H-Bahrami