Note that there are some explanatory texts on larger screens.

plurals
  1. PONullPointerException on lockCanvas()
    primarykey
    data
    text
    <p>I'm developing a little game (test) for Android, but I don't understand the logic to make a good Timer thread with SurfaceView.</p> <p>I'm getting a problem with [SurfaceView object].getHolder().lockCanvas(null). The problem is that lockCanvas is returning an invalid value (null, on this case).</p> <p>I can't catch this exception because I... can't! :/</p> <p>This is my code:</p> <pre><code>package game; import game.logics.SceneGroup; import game.scenes.TeamScene; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.Window; import android.view.WindowManager; // Definição da Atividade public class GameActivity extends Activity { // Definição do Ambiente public class GameSurface extends SurfaceView implements SurfaceHolder.Callback { public GameSurface(final Context context) { super(context); this.getHolder().addCallback(this); this.setFocusable(true); } @Override public void surfaceChanged(final SurfaceHolder arg0, final int arg1, final int arg2, final int arg3) {} @Override public void surfaceCreated(final SurfaceHolder arg0) { GameActivity.this.running = true; } @Override public void surfaceDestroyed(final SurfaceHolder arg0) { GameActivity.this.running = false; } public void update(final Canvas canvas) { GameActivity.this.scenes.update(canvas); } } class GameTask extends TimerTask { @Override public void run() { if(GameActivity.this.running == false) { return; } final SurfaceHolder holder = GameActivity.this.surface.getHolder(); Canvas canvas = null; try { canvas = holder.lockCanvas(); canvas.drawColor(Color.BLACK); synchronized(holder) { GameActivity.this.surface.update(canvas); } } finally { if(canvas != null) { holder.unlockCanvasAndPost(canvas); } } } } private GameSurface surface; private SceneGroup scenes; private Timer timer; private TimerTask task; private boolean running = false; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); this.getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // ### SOLVE: PROBLEM START HERE ### this.surface = new GameSurface(this); this.scenes = new SceneGroup(this); this.scenes.add(new TeamScene(this)); this.timer = new Timer(); this.task = new GameTask(); // ### SOLVE: PROBLEM END HERE ### // ### Invalid new instance of GameSurface ### this.setContentView(new GameSurface(this)); } @Override public void onPause() { super.onPause(); this.timer.cancel(); } @Override public void onResume() { super.onResume(); this.timer.scheduleAtFixedRate(this.task, 0, 33); } } </code></pre> <p>I'm doing right? What I can do to fix my code?</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload