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

Вы делаете что-то, что блокирует пользовательский интерфейс? Обновление пользовательского интерфейса не произойдет, пока поток пользовательского интерфейса не будет доступен для его выполнения. – Kai

+0

@ Кай, это все мой код, как вы можете видеть, я почти ничего не делаю в основной теме. – glagola

ответ

1

Я нашел решение моей проблемы! unlockCanvasAndPost() не отправляет invalidate в SurfaceView, поэтому просто добавьте surface.postInvalidate() сразу после разблокировки блокировкиCanvasAndPost() при запуске.

+0

У меня была точно такая же проблема, я подтверждаю, что она работает! :) – Annihil

0

Вы можете использовать TraceView, чтобы найти, где задержка есть.

Проверьте profiling with traceview введение.

Cheers!

Смежные вопросы