Eigenes Event bzw. Zurückspringen zum UI Thread

realpk

Mitglied
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:
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();
        	}

        });
        
    }
...
 
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?
 
ä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*
Java:
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*
 
Eigenes Event bzw. Zurückspringen z ...

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ß

Sascha
 
Und auch hier nochmal eine mündliche Verwarnung spIkeE.
Halte dich an die Netiquette oder du kommst auf die Strafbank!
 
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
 
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
 
Zurück