2011-04-12 4 views
1

Microsft Exchange를 사용하면 장치를 켤 때마다 사용자가 암호를 화면에 표시해야합니다.장치의 암호 화면을 사용할 때 게임이 충돌합니다

스레드로 실행되는 SurfaceView를 사용하는 게임을 만들고 있습니다. 나는 많은 정적 변수를 사용하고있다. 게임 도중 장치가 꺼져 있고 암호를 입력하면 게임 화면이 표시되지만 일부 비트 맵의 ​​크기가 잘못되어 멈췄습니다.

로그에서 처음에는 UI가 아닌 스레드에서 NullPointerException이 표시되고 나중에 ANR 오류가 표시됩니다. 장치를 끄면 내 응용 프로그램의 일부 개체가 파괴 된 것처럼 보이지만 아직 돌아 왔을 때 다시 onCreate 및 SurfaceView 생성자를 통과하지 못했습니다.

전화 통화 또는 홈 버튼을 눌러 게임을 일시 중지해도 아무런 문제가 없습니다. 또한 두 개의 다른 장치에서 게임은 게임 도중에 켜거나 껐다가 잘 작동하지만 보안 화면이 없습니다. 나는 갤럭시 탭을 사용하고

, OS 2.2

편집 :

을 android.graphics.Canvas.throwIfRecycled 스레드의 스택 트레이스를 인쇄, 내가 얻을 후

일부 비트 맵이 재활용 된 것 같습니다. onResume 또는 surfaceChanged()에서이를 감지하는 방법에 대한 아이디어가 있습니까?

+0

스택 추적이 실제로 도움이됩니다. 전원을 켤 때 게임이 다시 시작됩니까? db/file/preferences에 대한 데이터를 유지하고 있습니까? –

+0

로그에서 무엇을 얻을 수 있는지 알려주십시오. –

답변

0

이 문제에 대한 해결책은 이벤트의 올바른 순서와 함께 재개되지 않으면이 활동을 종료하는 것입니다. onSurfaceChanged가 onSurfaceCreated없이 먼저 발생하면이 작업을 닫습니다. 게임의 상태는 여전히 유지 될 수 있으며 플레이어가이 활동을 다시 시작할 때 멈추는 위치에서 계속됩니다.

@Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 

     //if it does not start through surfaceCreated close activity 
     // because some bitmaps could be recycled and crash the application 
     if (!surfaceCreatedFirst){ 
      _thread.setRunning(false); //stop the thread 
      ((Activity) context1).finish(); //close activity 
     } 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     surfaceCreatedFirst = true; 
     _thread = new FootballThread(holder, this); 
     _thread.setRunning(true); 
     _thread.start(); 
    } 
관련 문제