2013-07-27 174 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