ERLEDIGT
JA
JA
ANTWORTEN
13
13
ZUGRIFFE
909
909
EMPFEHLEN
-
Hallo,
ich spiele ein bisschen gerade mit Java Android entwicklung herum. Wobei der Schwerpunkt meiner Frage reines Java ist.
Leider ist mir aufgefallen, dass ich bei dem Thema einpaar Lücken habe und komme da irgendwie nicht weiter.
Damit meine Anwendung nicht hängt, möchte ich die Daten über einen weiteren Thread besorgen. Leider darf dieser Thread nicht auf das UI zugreifen. Nun muss ich irgendwie wieder auf den richtigen Thread. Welche guten Möglichkeiten habe ich da in Java?
Ich wollte es mit einem Event probieren. Scheinbar funktionieren Events in Java aber so, dass ich meine Listener als List speichere und dann einfach nur die Methoden der Listener aufrufe um das Event auszulösen. D. h. bei dem Thread Problem würde es mir nicht weiterhelfen, da die Events auch im gleichen Thread behandelt werden. Oder sehe ich das falsch?
Vielen Dank und Grüße
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
public class activityClass extends Activity implements EventListener { TextView tv; String abc = ""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); abc = ""; ImageButton ib = (ImageButton)findViewById(R.id.imageButton1); tv = ((TextView)(findViewById(R.id.textView1))); ib.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { new Thread(new Runnable() { public void run() { try { // BufferedReader füllt an dieser Stelle den String abc } // catch Blöcke } }).start(); } }); } ...
-
26.03.11 09:41 #2SE Tutorials.de Gastzugang
ich möchte hier mal nachfragen weil ich eines nicht verstehe
warum darf dein thread nicht auf die UI zugreifen ?
ich mein ... erstellen tust du die UI doch auch in einem eigenen thread *wenn du von main aus alles durchgehst ist das auch ein thread .. sog. Main-Thread* ...
und wenn du jetzt das eventhandling in einen extra thread umleitest dann musst du diesem nur eine instanz der UI übergeben um darauf zugreifen zu können ...
oder ist das durch irgendwelche umstände die ich nicht kennte unterbunden / nicht gestattet ?
ansonsten können wir dir gerne helfen dein eventhandling in einen eigenen thread auszulagern *damit die UI halt nicht freezed*
-
Hi, das Mainthread hat das UI erzeugt und der Workerthread soll nun etwas daran ändern. Die Referenz auf das Steuerelement habe ich. Aber wenn ich dies nun manipulieren will, bekomme ich eine Exception, dass ich im "falschen" Thread bin.
Wie wäre dein Vorschlag bzw. Umsetzung mit Eventhandling damit das UI nicht einfriert?
-
26.03.11 21:34 #4SE Tutorials.de Gastzugang
ähäm ... erstens : poste doch bitte mal die exception ... weil mir ist auch nichts in nur irgendeiner weise bekannt das soetwas ausdrücken soll ...
zweitens : meine variante des event-handling > auslagerung in externen thread
du registrierst an einer component irgendeinen listener ...
in der implementierung des listeners erzeugst du eine instanz einer klasse die runnable implementiet *oder halt von thread erbt* ... übergibst ihr das event und alle nötigen refferrenzen ... und schreibst dann am ende noch start() dran ...
zur erläuterung *beispiel ActionListener*
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
public class Demo implements ActionListener { public static void main(String[] args) { new Demo(); } public Demo() { JFrame jf=new JFrame(); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(800, 600); jf.setLocation(200, 100); jf.setLayout(new FlowLayout()); JButton jb=new JButton("BUTTON"); jb.addActionListener(this); jb.setActionCommand("jb"); jf.add(jb); jf.setVisible(true); } public void actionPerformed(ActionEvent e) { (new Thread() { public void run() { //TO-DO } }).start(); } }
*ob man jetzt noch auf das ActionEvent zugreifen kann weis ich nich ... propiers mal aus*
-
Hallo,
@SPiKEe
es ist zwar nett, dass du versuchst den Usern zu helfen, aber ich würde dich bitten dabei auch auf deine Groß- und Kleinschreibung zu achten.
Gruß
SaschaEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
Und auch hier nochmal eine mündliche Verwarnung spIkeE.
Halte dich an die Netiquette oder du kommst auf die Strafbank!keep on smiling
www.smileyml.de
Typografie-Basiswissen | Grafik - Basiswissen
TypoWars | ...ja, auch im Chat
-
Da ist wohl was schief gelaufen. Hab es korrigiert.
Gruß
SaschaEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
Hi, danke für dein Beispiel.
Leider erkenne ich darin aber keinen Unterschied bzgl. Threads zu, meiner Lösung. Ob ich nun eine Methode nach der Fertigstellung aufrufe oder dies durch ein Event trigger. Ich bleibe doch immer im gleichen Thread!? Oder arbeitet jeder Thread das Event ab?
Die Exception lautet übrigens: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Das Problem mit dem Zugriff auf Steuerelementen, aus einem anderen Thread, besteht doch eigentlich meistens.
VG
-
Schau mal hier, das sollte dir eigentlich helfen.
http://developer.android.com/resourc...i-updates.html
Hab nur kurz drüber geschaut, sieht aber nach einer Lösung über Events aus.
Das hat aber nicht direkt was mit Java, sondern mehr mit dem Android-Framework zu tun.Welche guten Möglichkeiten habe ich da in Java?
Gruß
SaschaEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
27.03.11 20:15 #10SE Tutorials.de Gastzugang
gut ... das nun eine exception von einem framework fliegt das ich nicht kenne erklärt natürlich das ich keine kenntnis dieser exception habe ...
es scheint wie Sascha schon sagt etwas mit dem android-framework oder -plattform zu tun zu haben ...
ich persönlich muss mich leider jeglichem hilfeversuch enthalten da ich keine kenntnis über das verwendeten framework habe ...
dachte halt anfänglich das es ein gewöhnliches problem mit einer gefreezedten UI wäre ... lag da aber falsch
-
Naja, ich habe zwei Threads. Thread A erzeugt Thread B. Meine Frage ist, wie komme ich von Thread B wieder auf Thread A.
In C# kenne ich das Vorgehen über InvokeRequired und wenn benötigt dann ein Invoke.
Eine Lösung über einen Timer ist dafür nicht die richtige Wahl. Verschleudern von Ressourcen und Performance, nur weil man nicht erkennt, was der richtige Weg für diesen Fall ist.
Ich habe mal geschaut, wie es allgemein bei Java läuft und etwas interessantes gefunden (http://stackoverflow.com/questions/2...s-in-java-j2me).
Dort steht z. B. dass bei Swing nur auf die Komponenten über den "event dispatch thread" schreibend zugegriffen werden darf.
Allgemein würde ich es auch sehr unsauber finden, wenn jeder Thread irgendwie auf der UI rumhantiert.
-
28.03.11 08:03 #12SE Tutorials.de Gastzugang
dein post bezieht sich hier aber wie im link schon steht auf die J2ME ... ich kenne mich aber nur in der J2SE aus *ja .. ich schaffe es nicht mal J2EE mit tomcat zum laufen zu bekommen
*
wenn du jetzt also durch J2ME und Android vorgeschrieben bekommst das nur der EDT auf UI-componenten schreiben zugreifen darf ... dann sollte auch irgendwo in der doc dazu stehen wie man dann diesen EDT manipuliert damit er das macht was man will ...
man könnte sicher irgendwas über die SystemEventQueue und invokeLater(Runnable) basteln ... aber ob das in J2ME auch so geht weis ich wie gesagt nicht ...
ich wollte mich zwar mal mit J2ME beschäftigen .. aber mir war der konzeptionelle aufbau schon kompliziert genug davon gleich wieder die finger zu lassen
-
28.03.11 13:45 #13
- Registriert seit
- Jun 2009
- Beiträge
- 870
Dalvik (Android's Interpreter für Java-ähnlichen Bytecode) hängt nicht direkt mit J2ME zusammen, sondern ist ein Fork von Apache Harmony (eine J2SE Runtime). Wie das graphische Framework von Android aufgebaut ist, weiß ich leider nicht. Allerdings gilt für jede Anwendung (fast unabhängig von der Programmiersprache) die Regel, dass zeitaufwändige Arbeiten nicht in dem Thread ausgeführt werden sollen, der für die graphische Darstellung zuständig ist. Wichtig ist auch, dass man bedenkt, dass alle I/O-Operationen zeitaufwändig sein können (z.B. wenn Dateien von einer Netzwerkfestplatte geholt werden, wenn die Festplatte sich erst hochfahren muss, überlastet ist, ...).
Unter Swing/AWT würde man da ein AWTEvent nutzen, siehe https://secure.wikimedia.org/wikiped...atching_thread und http://download.oracle.com/javase/tu...ncy/index.htmlNaja, ich habe zwei Threads. Thread A erzeugt Thread B. Meine Frage ist, wie komme ich von Thread B wieder auf Thread A.
Mit diesem Stichwort findet man auch Artikel zu Android:
http://developerlife.com/tutorials/?p=1263
vielleicht hilft dir auch dieser "SwingWorker" weiter: http://linuxmedianetwork.blogspot.com/Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
Yeah habs mit AsyncTask hinbekommen. Danke für eure Tipps.
Ähnliche Themen
-
Ein eigenes Betriebssystem fragen Thread
Von cinema im Forum Sonstige SprachenAntworten: 6Letzter Beitrag: 07.11.10, 11:10 -
[eclipse] Eigenes Event feuern?
Von Vatar im Forum JavaAntworten: 5Letzter Beitrag: 27.05.07, 12:51 -
Eigenes Event erstellen
Von Divi im Forum .NET Windows FormsAntworten: 10Letzter Beitrag: 27.05.06, 20:08 -
eigenes Event
Von skoWWi im Forum JavaAntworten: 3Letzter Beitrag: 16.06.05, 19:29 -
Wie mache ich ein eigenes Event mit eigenem Listener?
Von GoldKaetzchen im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 8Letzter Beitrag: 21.05.05, 15:00





Zitieren


Login





