2017-09-15 4 views
2

Hallo Ich versuche, SurfaceView und Threads zu verwenden, um schneller auf Canvas zu zeichnen. Bisher habe ich es geschafft, auf der Leinwand zu zeichnen, indem ich einfach die View-Klasse erweitere und die Draw-Methode einzeichne. Außerdem habe ich die Fähigkeit, die Zeichenfläche neu zu zeichnen, wenn Benutzer Eingaben über die Tastatur vornehmen (indem sie den Schlüsselcode einer Aktivität an die benutzerdefinierte Ansicht übergeben).Zeichnung auf Leinwand mit separatem Thread Android

Das Problem ist, dass ich mit Multithreading stecken bin, habe ich die View-Klasse mit der SurfaceView ersetzt und implementiert Runnable (gefolgt this Tutorial). Aber ich kann Schlüsselcode nicht übergeben, wenn Schlüsseleingabe aufgetreten ist. Wenn ich die invalidate() -Methode für die benutzerdefinierte Ansicht aufruft, passiert nichts. Der einzige Unterschied zu tutorial Code und Mine ist, dass ich while-Schleife dieser Linie Ende hinzugefügt:

retry = false; 

Um Faden nach Zeichnungen zu stoppen ausführt. Und nach jedem Klick in Aktivität diese Zeile hinzugefügt, so dass ich alles neu zeichnen kann.

view.resume(); 

Probleme: -Blick nicht ungültig auf Schlüsselereignisse und nicht zieht keine neue Bilder (nicht sicher, warum)

  • , wenn ich durch den Aufruf Thread.Join Thread stop(); Methode, bleiben andere Objekte in CustomView im Heapspeicher oder werden sie zerstört?

  • Wie wird diese App automatisch beim Start ausgeführt und danach nur beim Klicken ausgeführt?

  • Warum Invalidate-Methode nicht die Zeichenfläche löschen, wenn ich explizit vor view.resume() aufrufen?

p.s. Ich muss Codebeispiele posten, lass es mich wissen und ich werde git Repo mit Test-App anhängen.

Dank

Antwort

0

In Android haben Sie die Handler-Klasse, die Sie implementieren können, um Nachrichten zu senden, können Sie es innerhalb der Faden Sie handle, auf andere Themen Sie nachrichts verwenden empfangen möchten erstellen und zu implementieren.

Eine andere Sache, für boolesche Flags und Multithreading, sollten Sie das Schlüsselwort volatile zu einigen VM-Optimierungen verwenden.

volatile boolean retry = false; 
+0

Ich habe das flüchtige Schlüsselwort hinzugefügt, aber nichts hat sich geändert. danke – hogar

+0

posten Sie Ihren vollständigen Code –

Verwandte Themen