glagola
glagola

Reputation: 2232

Strange delay on start my android app

I should warn you I'm newbie of android developing.

The problem: After my app starts, it has black screen and after few seconds, it starts to draw what I need. I've checked drawing thread already started, and already drew content several times, but screen is still black :(

What I'm missing?

Here is my code:

Activity

public class MainActivity extends Activity {
    protected SurfaceView surface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        surface = new GameSurfaceView(this);
        setContentView(surface);        
    }
}

SurfaceView

public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback {

    protected DrawThread drawThread;

    public GameSurfaceView(Context context) {
        super(context);

        getHolder().addCallback(this);

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        drawThread = new DrawThread(getHolder());       
        drawThread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        drawThread.interrupt();
    }

}

Drawing thread

public class DrawThread extends Thread {
    public static final long FPS = 30; 

    protected SurfaceHolder surfaceHolder;

    public DrawThread(SurfaceHolder surfaceHolder) {
        super();
        this.surfaceHolder = surfaceHolder; 
    }

    @Override
    public void run() {
        while (!isInterrupted()) {
            Canvas canvas = null;
            try {

                long renderStartedAt = SystemClock.elapsedRealtime();

                canvas = surfaceHolder.lockCanvas();

                if (canvas != null) {
                    canvas.drawColor(Color.CYAN);
                    // TODO DRAW
                }

                long duration = (1000 - (SystemClock.elapsedRealtime() - renderStartedAt) * FPS) / FPS;
                if (duration > 0) {
                    sleep(duration);
                }
            } catch (InterruptedException e) {
                interrupt();
            } finally {
                if (canvas != null) {
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }
}

Upvotes: 1

Views: 495

Answers (2)

glagola
glagola

Reputation: 2232

I found the solution of my problem! unlockCanvasAndPost() does not send invalidate to SurfaceView, so just adding surface.postInvalidate() right after unlockCanvasAndPost() fix delay on startup.

Upvotes: 1

mach
mach

Reputation: 8395

You can use traceview to find where the holdup is.

Check out the profiling with traceview introduction.

Cheers!

Upvotes: 0

Related Questions