Android Zeichenview alle 3 Sekunden aktualisieren

estartu

Mitglied
Hallo, ich möchte meine zeichenview alle drei Sekunden aktualisieren.
Ich habe hier zwei Klassen.
MainActivity.java und
ZeichenView.java

In der ZeichenView wird natürlich etwas gezeichnet und das möchte ich alle drei Sekunden aktualisieren.
Dazu habe ich in der MainActivity.java einen Thread eingefügt. So sieht meine MainActivity.java aus:

Java:
public class MainActivity extends Activity {
	private ZeichenView zview;
	private Runnable r;
	private Thread t;
	private volatile boolean keepRunning;
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		zview = new ZeichenView(this);
		zview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 600));
		
		
		//zview.setBackgroundColor(255);
		zview.setBackgroundColor(Color.WHITE);
		LinearLayout layout = (LinearLayout) findViewById(R.id.linearlayout1);
		layout.addView(zview);
		
		r = new Runnable(){
			@Override
			public void run(){
				while (keepRunning){
					zview.invalidate();
					try{
						Thread.sleep(3000);
					} catch (InterruptedException e) {
						
					}
				}
			}
		};
		
	}
		@Override
		protected void onStart() {
			super.onStart();
			t = new Thread(r);
			keepRunning = true;
			t.start();
		}
		
		
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

}

Wenn ich die App starte bekomme ich fogende Fehlermeldung.
"android.view.ViewRoot$CalledFromWrongThreadException: Only the original Thread that created a view hierarchy can touch its views."

Was mache ich falsch?

estartu
 
A

asdfghjl

Gast
Das liegt daran, dass die UI nicht threadsafe ist und deshalb Änderungen ausserhalb des UI Threads unterbunden werden.
Lösung: Handler und Messages verwenden. Im UI Thread einen Handler erzeugen, der (in der überschriebenen
Code:
handleMessage...
) die View Komponente aktualisiert.
In der run des Threads über den Handler per sendMessage eine beliebige Message senden lassen.
 

schlingel

Gesperrter Benutzer
asdfghjl hat im Grunde Recht, allerdings gibt's im Android-Framework schon fix fertig etwas. Das ganze nennt sich SurfaceView und ist darauf ausgelegt, dass das Zeichnen außerhalb des UI-Threads passiert.

Hier ist ein Minimal-Beispiel: Android Coding: Drawing on a Surface View

Es ist natürlich auch möglich, die Zeichenroutinen in eine eigene Klasse zu packen und nicht so wie in dem Beispiel die SurfaceView Runnable implementieren zu lassen.
 

estartu

Mitglied
Hallo asdfghjl,

das hört sich ja gut an mit
Im UI Thread einen Handler erzeugen, der (in der überschriebenen handleMessage... ) die View Komponente aktualisiert.
In der run des Threads über den Handler per sendMessage eine beliebige Message senden lassen.
aber leider kann ich mit meinem jetzigen Programmierwissen nichts damit anfangen.
Da bräuchte ich ein Beispiel aber Trotzdem vielen Dank.

Ich habe es mal mit dem link von schlingel versucht. Das funktionier und ich konnte es so
umändern das alle drei Sekunden gezeichnet wir. Danke für den link.


estartu
 

Neue Themen


Oben