SurfaceView wird nicht gezeichnet

  • 4 Antworten
  • Neuester Beitrag
Diskutiere SurfaceView wird nicht gezeichnet im Android Spiele Entwicklung im Bereich Android App Entwicklung.
A

Arif12

Neues Mitglied
Hallo, ich verwende ein SurfaceView zum Zeichnen des Spiels, aber irgendwie wird nichts gezeichnet bzw. ich sehe nur schwarz ^^
Java:
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        arena = new Arena(this);
        arena.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        setContentView(arena);
        figures = new ArrayList<>();
        spawn();
    }
Ich erzeuge eine Arena, konfiguriere es und setze es als Contentview.


Java:
public Arena(Context context) {
        super(context);
        getHolder().addCallback(this);
        p = new Paint(Paint.ANTI_ALIAS_FLAG);
    }
Im Konstruktor von Arena registriere ich den Callback

Java:
public void surfaceChanged(@NonNull final SurfaceHolder surfaceHolder, int i, int i1, int i2) {
        new Thread(new Runnable() {
            public void run() {
                while (true) {
                    Canvas canvas = surfaceHolder.lockCanvas();
                    draw(canvas);
                    surfaceHolder.unlockCanvasAndPost(canvas);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
In surfaceChanged erzeuge ich ein Thread welcher den Canvas regelmäßig zeichnen soll, aber es passiert nichts. Was ist das Problem?
 
J

jogimuc

Stammgast
Hallo
Du solltest schon für das locken und delocken des Canves den richtigen Holder benutzen.
Die Variable "surfaceHolder" wird in dem Thread wenn die changed Methode beendet ist nicht mehr vorhanden sein.

Du host ihn zwar im Konstruktor "getHolder()" aber speichen damit du ihn auch in deinem Thread benutzen kannst tust du ihn nicht.
 
Zuletzt bearbeitet:
J

jogimuc

Stammgast
Was auch falsch ist. Du hast auch die surface Changed Methode durch final verändert somit ist es eigentlich nicht mehr die interface methode die du überschreiben willst.

Das final hast du oder AS gemacht um es in dem Thread zu haben. Aber du hast es wenn überhaupt für einen kurzen Moment.
Diese Änderung hätte dich schon stutzig machen müssen.
 
A

Arif12

Neues Mitglied
jogimuc schrieb:
Was auch falsch ist. Du hast auch die surface Changed Methode durch final verändert somit ist es eigentlich nicht mehr die interface methode die du überschreiben willst..
Bei der Überschreibung/Implementierung von Methoden spielt final keine wichtige Rolle. final bezieht sich nur auf die lokale Variable. Der Thread wird weiter ausgeführt, auch wenn die Methode "zu ende" ist.
Beitrag automatisch zusammengefügt:

Liefert getHolder() nicht die gleiche Referenz?
 
Zuletzt bearbeitet:
J

jogimuc

Stammgast
Ja es findet ein override überschreiben statt. Aber ob du den richtigen Holder hast und ob er auch noch in den Thread vorhanden güldig ist, nach dem die Change Methode beendet wird ist fragwürdig. Ich denke nein.

In allen Beispielen im Netzt wird für einen laufenden Thread eine Klassen Variable benutzt die im Kostruktor gesetz wird.

Sonst hättest du ja das richtige Canvas und nicht nur einen schwarzen Bildschirm.

Von miraus zweifle weiter.

Der Thread läuft weiter du greifst auf die Holder Variable der Callback Methode zu. Die Methode wird aber auch beendet und der Thread läuft weiter. Was ist nun mit der übergeben Variable. Die wirt nicht mehr gültig sein. Java call by value, nicht call by referece wie in C

Das sollte ein Tipp sein wenn AS es zu einer final machen will. Warum will es das?
Beitrag automatisch zusammengefügt:

Die übergebe Variable zeigt zwar auf die gleiche reference aber die güldigkeit der Variablen ist beim beenden eigentlich weg.
Es wird nur eine Kopie der ref in einer Variablen übergeben und die Kopie wird beim beenden der Methode gelöscht.
Schaue Call by Value


Es ist und bleibt eine lokale Variable auch wenn sie final ist.

Frage was passiert mit lokalen Variablen wenn sie ungültig werden?
Sie werden von GC gelöscht.


Thread und final sollte man vermeiden.
 
Zuletzt bearbeitet: