SurfaceView wird nicht gezeichnet

A

Arif12

Neues Mitglied
2
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?
 
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:
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.
 
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.
Beiträge automatisch zusammengeführt:

Liefert getHolder() nicht die gleiche Referenz?
 
Zuletzt bearbeitet:
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?
Beiträge automatisch zusammengeführt:

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:

Ähnliche Themen

D
Antworten
3
Aufrufe
458
jogimuc
J
H
Antworten
24
Aufrufe
4.682
swa00
swa00
E
Antworten
1
Aufrufe
3.286
Jaiel
Jaiel
Zurück
Oben Unten