2011-07-08 13 views
4

私はいつも私がこのアプリケーションを開いているときにこの黒い画面が表示されていますが、これを取り除く唯一の方法は、戻るボタンを押してアプリケーションに行くことです。私は友人から、それがデッドロックになると言われましたが、私が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 [email protected] 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 

Activityクラス:

@Override public boolean onCreateOptionsMenu(メニューメニュー){ MenuInflater inflater = getMenuInflater(); inflater.inflate(メニューmenu_ menu、メニュー); がtrueを返します。 (:CTRL + F12のエミュレータで) }

@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"); 

} 
+1

なぜあなたは、黒い画面を取得するときにアプリを一時停止して見てみましょうしないでくださいあなたのスレッドはEclipseにありますか? – mibollma

+0

@mibollma私は、ユーザーがホームボタンでアプリを閉じるかアプリが中断されたときにそれを認識させようとしているので、私は一時停止機能を使いこなしていません。それはそれを気付き、ユーザーは強制的に閉じることなくアプリを再度開くことができます。私は物事が呼び出される方法を変更すると黒い画面の代わりに画面を表示するようにコードを編集できますが、強制/待機メッセージが表示されます。 – Manji

+0

実際、私はデバッガを使用して、黒い画面が表示されたときにスレッドがコード内のどの行に表示されているかを確認しました。 – mibollma

答えて

1

は、それがリフレッシュさせ、ディスプレイを回転させていますか?そうであれば、あなたのアクティビティでonResume()をオーバーライドして、呼び出されていない可能性のあるものを再起動する必要があります。あなたはアクティビティonResume()からview.invalidate()に電話するだけでいいですか?あなたはあなたの活動のコードを表示しないので、わかりません。私が見たコードで

、あなたの代わりにthis.onDraw(canvas)の(invalidate()としてではなく、別のスレッドからも同じ)this.postInvalidate()を使用して、あなたのスレッドでは対照的に、それは、UIスレッドで独自にthis.onDraw()を呼び出す必要があります。

+0

私は、マニフェストでlandscapeをlandscapeに設定しました。あなたが望むなら、アクティビティのソースコードを投稿することができますが、サーフェイスビューを呼び出すだけで膨らんだメニューで画面を変更することができます。 – Manji

+0

@Manji SurfaceViewはどこから呼び出されますか? onCreate()メソッド? – Ribose

+0

これはまったく同じではなく、onCreate()メソッドからsurfaceviewファイルを呼び出します。setContentView(SurfaceView()); – Manji

1

ここでスレッドを初期化しますか? (私はあなたがそれをやったと思うところである。)の代わりにsurfaceViewのconsturctorの)(surfaceCreatedにそうしてみ

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

} 
+0

いいえ、アプリを開いたときに強制終了しました。 – Manji

関連する問題