2013-07-27 100 views
1

我应该警告你我是Android开发人员的新手。奇怪的延迟启动我的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); 
       } 
      } 
     } 
    } 
} 
+0

你在做什么会阻止UI(主)线程?直到UI线程可用于执行UI更新才会发生。 – Kai

+0

@凯这就是我所有的代码,你可以看到我在主线程中几乎没有做任何事情。 – glagola

回答

1

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

+0

我有完全相同的问题,我确认它的工作原理! :) – Annihil