1

홈 버튼을 클릭하거나 화면 방향이 바뀌면 많은 솔루션을 시도했지만 아무도 작동하지 않았을 때 응용 프로그램이 충돌합니다. 내가 스레드를 종료와 연결되어있을 수도 있지만 프로그래밍에 새로운 그래서 내가 어떤 도움을 주셔서 감사합니다 알아 냈어. 여기에 코드와 logcat이 있습니다. 내가이의 솔루션 및 기타 포럼배경을 입력 할 때 응용 프로그램이 작동을 멈 춥니 다.

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getActionBar().hide(); 
    setContentView(new GameView(this)); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
} 

}`

public class GameView extends SurfaceView implements 
      SurfaceHolder.Callback { 


p private KulaSprite kula; 
private PaletkaSprite paletka; 
private PaletkaSprite paletka2; 
private GameLogic mGameLogic; 
private boolean mGameIsRunning = false; 
private int punkty = 0; 
private String p1 = Integer.toString(punkty); 
private int punkty2 = 0; 
private String p2 = Integer.toString(punkty2); 
private float speed; 
Paint paint = new Paint(); 

public void start() { 
    if (!mGameIsRunning) { 
     mGameLogic.setGameState(GameLogic.RUNNING); 
     mGameLogic.start(); 
     mGameIsRunning = true; 
    } else { 
     mGameLogic.onResume(); 
    } 
} 


    public GameView(Context context) { 
     super(context); 

     setFocusable(true); 
     WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
     Display display = wm.getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     int width = size.x; 
     int height = size.y; 
     kula = new KulaSprite(BitmapFactory.decodeResource(getResources(), R.drawable.kula), 600,300); 
     paletka = new PaletkaSprite(BitmapFactory.decodeResource(getResources(), R.drawable.paletka),15,height/2); 
     paletka2 = new PaletkaSprite(BitmapFactory.decodeResource(getResources(), R.drawable.paletka2), width-15,height/2); 
     mGameLogic = new GameLogic(getHolder(), this); 
     getHolder().addCallback(this); 
    } 

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

    @Override 
    public void surfaceCreated(SurfaceHolder holder){ 
     start(); 
    } 


    @Override 
    public void surfaceDestroyed(SurfaceHolder holder){ 
    } 

public void onDraw(Canvas canvas) { 
     canvas.drawColor(Color.rgb(00, 60, 10)); 
     paint.setTextSize((getHeight()*2)/3); 
     paint.setColor(Color.rgb(00, 80, 10)); 
     canvas.drawText(p1, getWidth()/12, (getHeight()*3)/4,paint); 
     canvas.drawText(p2, getWidth()/2, (getHeight()*3)/4,paint); 
     kula.draw(canvas); 
     paletka.draw(canvas); 
     paletka2.draw(canvas); 


    } 




public class GameLogic extends Thread { 

private SurfaceHolder _surfaceHolder; 
private GameView mGameView; 
private int game_state; 
public static final int PAUSE = 0; 
public static final int READY = 1; 
public static final int RUNNING = 2; 
private Object mPauseLock = new Object(); 
private boolean mPaused; 


public GameLogic(SurfaceHolder surfaceHolder, GameView mGameView) { 
    super(); 
    this._surfaceHolder = surfaceHolder; 
    this.mGameView = mGameView; 
} 



public void setGameState(int gamestate) { 
    this.game_state = gamestate; 
} 

public int getGameState(){ 
    return game_state; 
} 

public void onPause() { 
    synchronized (mPauseLock) { 
     mPaused = true; 
    } 
} 

public void onResume() { 
    synchronized (mPauseLock) { 
     mPaused = false; 
     mPauseLock.notifyAll(); 
    } 
} 

@Override 
public void run() { 

    Canvas canvas; 
    canvas = null; 

    while (game_state == RUNNING) { 


     try { 
       canvas = this._surfaceHolder.lockCanvas(null); 
       synchronized (_surfaceHolder) { 
        this.mGameView.update(); 
        this.mGameView.onDraw(canvas); 

       } 
     } 

     finally { 
        if (canvas != null) { 
         _surfaceHolder.unlockCanvasAndPost(canvas); 
        } 
     } 
     synchronized (mPauseLock) { 
      while (mPaused) { 
       try { 
        mPauseLock.wait(); 
       } catch (InterruptedException e) { 
       } 
      } 
     } 
    } 
} 

}

03-30 14:19:24.880: D/libEGL(3010): loaded /system/lib/egl/libEGL_tegra.so 
03-30 14:19:24.910: D/libEGL(3010): loaded /system/lib/egl/libGLESv1_CM_tegra.so 
03-30 14:19:24.920: D/libEGL(3010): loaded /system/lib/egl/libGLESv2_tegra.so 
03-30 14:19:24.960: D/OpenGLRenderer(3010): Enabling debug mode 0 
03-30 14:19:29.270: W/dalvikvm(3010): threadid=11: thread exiting with uncaught   exception (group=0x41703ba8) 
03-30 14:19:29.270: E/AndroidRuntime(3010): FATAL EXCEPTION: Thread-2715 
03-30 14:19:29.270: E/AndroidRuntime(3010): Process: com.pingpong, PID: 3010 
03-30 14:19:29.270: E/AndroidRuntime(3010): java.lang.NullPointerException 
03-30 14:19:29.270: E/AndroidRuntime(3010):  at  com.GameView.onDraw(GameView.java:88) 
03-30 14:19:29.270: E/AndroidRuntime(3010):  at com.pingpong.GameLogic.run(GameLogic.java:60) 
+0

일부 일반적인 메모는 여기에 있습니다. http://stackoverflow.com/questions/21567641/should-the-renderingthread-of-a-surfaceview-have-the-same-life-cycle-as-the-view/21684399 # 21684399 – fadden

답변

1

의 원인이됩니다 장치를 뒤로 버튼을 누르거나 회전을 구현하려했기 때문에 코드는 매우 혼란이다 그 자체를 재현하는 활동. 게임을하고 있기 때문에 AndroidManifest 파일에서 원하는 방향으로 화면을 잠그면 방향 변경으로 인해 움직이지 않습니다. http://developer.android.com/guide/topics/manifest/activity-element.html

당신이 활동 onPause() 또는 onStop()을 무시하고 실행에서 게임 루프를 중지해야 사용자 종료 (다시 누르거나 홈을 누릅니다)를 처리합니다. 그것들은 별도의 스레드에 있기 때문에, 당신이 활동 중인지 여부에 관계없이 루프는 계속 실행됩니다.