Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 启动我的android应用程序时出现奇怪的延迟_Java_Android_Surfaceview - Fatal编程技术网

Java 启动我的android应用程序时出现奇怪的延迟

Java 启动我的android应用程序时出现奇怪的延迟,java,android,surfaceview,Java,Android,Surfaceview,我应该警告你,我是android开发的新手。 问题:在我的应用程序启动后,它出现了黑屏,几秒钟后,它开始绘制我需要的内容。我已经检查了绘图线程已经开始,并且已经绘制了几次内容,但屏幕仍然是黑色的:( 我错过了什么? 这是我的密码: 活动 public class MainActivity extends Activity { protected SurfaceView surface; @Override protected void onCreate(Bundle s

我应该警告你,我是android开发的新手。

问题:在我的应用程序启动后,它出现了黑屏,几秒钟后,它开始绘制我需要的内容。我已经检查了绘图线程已经开始,并且已经绘制了几次内容,但屏幕仍然是黑色的:(

我错过了什么?

这是我的密码:

活动

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();
    }

}
画线

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);
                }
            }
        }
    }
}

您可以使用traceview查找滞留的位置

看看介绍


干杯!

您可以使用traceview查找阻塞的位置

看看介绍


干杯!

我找到了问题的解决方案!unlockCanvasAndPost()不会将invalidate发送到SurfaceView,因此只需在unlockCanvasAndPost()之后立即添加surface.postInvalidate(),即可修复启动延迟。

我找到了问题的解决方案!unlockCanvasAndPost()不会将invalidate发送到SurfaceView,因此只需在解锁CanvasAndPost()后立即添加surface.postInvalidate(),即可修复启动延迟。

您是否正在执行会阻止UI(主)的操作线程?在UI线程可以执行之前,UI更新不会发生。@Kai这是我的全部代码,正如您所看到的,我在主线程中几乎什么都没有做。您是否正在做一些会阻止UI(主)的事情线程?UI更新只有在UI线程可以执行时才会发生。@Kai这是我的全部代码,正如你所看到的,我在主线程中几乎什么都没做。我有完全相同的问题,我确认它可以工作!:)我有完全相同的问题,我确认它可以工作!:)