Черный экран, когда приложение открывается

Я продолжаю получать этот черный экран, когда когда-либо открываю свое приложение, единственный способ избавиться от него – нажать кнопку «Назад», затем перейти к приложению. Мне сказал мой друг, что он зашел в тупик, но я не думаю, потому что, когда я проверяю logcat, он показывает сообщения журнала.

Посмотреть

private boolean mGameIsRunning; public void surfaceCreated(SurfaceHolder holder) { // Your own start method. start(); } public void start() { if (!mGameIsRunning) { thread.initLevel(); thread.setRunning(true); thread.start(); mGameIsRunning = true; } else { thread.onResume(); thread.initLevel(); thread.setRunning(true); } } public void surfaceDestroyed(SurfaceHolder holder) { Log.d(TAG, "Surface is being destroyed"); // tell the thread to shut down and wait for it to finish // this is a clean shutdown boolean retry = true; thread.setRunning(false); while (retry) { try { thread.join(); retry = false; } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Log.d(TAG, "Thread was shut down cleanly"); } 

Нить

 private Object mPauseLock = new Object(); private boolean mPaused; @Override public void run() { Canvas canvas; Log.d(TAG, "Starting game loop"); while (running) { canvas = null; // try locking the canvas for exclusive pixel editing // in the surface try { canvas = this.mSurfaceHolder.lockCanvas(); synchronized (mSurfaceHolder) { mStartTime = System.currentTimeMillis(); mElapsedTime = System.currentTimeMillis() - mStartTime; this.updateGame(); this.onDraw(canvas); } synchronized(mPauseLock){ while (mPaused) { try { mPauseLock.wait(); } catch (InterruptedException e) { } } } } finally { // in case of an exception the surface is not left in // an inconsistent state if (canvas != null) { mSurfaceHolder.unlockCanvasAndPost(canvas); } } // end finally } } public void onPause() { synchronized (mPauseLock) { mPaused = true; } } public void onResume() { synchronized (mPauseLock) { mPaused = false; mPauseLock.notifyAll(); } } 

Журнал

 07-08 17:24:41.735: DEBUG/Hitman(3221): View added 07-08 17:24:41.895: DEBUG/(3221): Enemies Spawed 07-08 17:24:41.934: DEBUG/(3221): Starting game loop 07-08 17:24:42.165: INFO/ActivityManager(66): Displayed activity com.android.hitmanassault/.Hitman: 1384 ms (total 1384 ms) 07-08 17:24:46.164: DEBUG/(3221): Enemies Spawed 07-08 17:24:48.914: INFO/ActivityManager(66): Start proc com.android.settings for broadcast com.android.settings/.widget.SettingsAppWidgetProvider: pid=3228 uid=1000 gids={3002, 3001, 3003} 07-08 17:24:48.914: INFO/ActivityManager(66): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.android.launcher/.Launcher } 07-08 17:24:48.924: DEBUG/PhoneWindow(3221): couldn't save which view has focus because the focused view com.android.hitmanassault.HitmanView@44d99528 has no id. 07-08 17:24:48.954: INFO/WindowManager(66): Setting rotation to 0, animFlags=0 07-08 17:24:49.014: INFO/ActivityManager(66): Config changed: { scale=1.0 imsi=310/260 loc=en_US touch=3 keys=2/1/2 nav=3/1 orien=1 layout=34} 07-08 17:24:49.275: DEBUG/(3221): Surface is being destroyed 07-08 17:24:49.285: DEBUG/(3221): Thread was shut down cleanly 07-08 17:24:49.694: DEBUG/ddm-heap(3228): Got feature list request 07-08 17:24:49.754: WARN/IInputConnectionWrapper(3221): showStatusIcon on inactive InputConnection 07-08 17:24:51.315: DEBUG/dalvikvm(66): GC freed 2325 objects / 114696 bytes in 122ms 07-08 17:24:58.234: INFO/ActivityManager(66): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.hitmanassault/.HitmanTitle } 07-08 17:24:58.284: INFO/WindowManager(66): Setting rotation to 1, animFlags=0 07-08 17:24:58.354: INFO/ActivityManager(66): Config changed: { scale=1.0 imsi=310/260 loc=en_US touch=3 keys=2/1/2 nav=3/1 orien=2 layout=34} 07-08 17:24:58.554: DEBUG/(3221): Enemies Spawed 07-08 17:24:58.945: WARN/IInputConnectionWrapper(144): showStatusIcon on inactive InputConnection 07-08 17:25:00.604: DEBUG/dalvikvm(66): GC freed 1403 objects / 71832 bytes in 103ms 

Класс деятельности:

@Override public boolean onCreateOptionsMenu (меню меню) {MenuInflater inflater = getMenuInflater (); Inflater.inflate (R.menu.game_menu, меню); Return true; }

 @Override public boolean onOptionsItemSelected(MenuItem item){ switch(item.getItemId()){ case R.id.menu_restart: startActivity(new Intent(this, Hitman.class)); return true; case R.id.menu_scores: startActivity(new Intent(this, HitmanScores.class)); return true; case R.id.menu_help: startActivity(new Intent(this, HitmanHelp.class)); return true; default: return super.onOptionsItemSelected(item); } } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new CanvasSurfaceView(this)); Log.d(TAG, "View added"); } 

Вращение дисплея приводит к его обновлению (в эмуляторе: CTRL + F12)? Если это так, вы должны переопределить onResume () в своей деятельности и перезапустить все, что вы настроили, которые не могут быть вызваны. Может быть, вам просто нужно вызвать view.invalidate() из действия onResume ()? Вы не показываете код из своей деятельности, поэтому я не уверен.

В коде, который я видел, вы должны использовать this.postInvalidate() (то же самое, что invalidate() но из другого потока) вместо this.onDraw(canvas) и this.onDraw() ему this.onDraw() самостоятельно в пользовательском интерфейсе Нить, в отличие от вашей нити.

Где вы инициализируете свою нить? Попытайтесь сделать это в методе surfaceCreated (), а не в surfaceView consturctor (где я думаю, что вы это сделали).

 public void surfaceCreated(SurfaceHolder holder) { // Restart draw thread Thread.State state = thread.getState(); if(state == Thread.State.TERMINATED) thread = new MyThread(getHolder(), getContext()); thread.setRunning(true); thread.start(); }