0

私は contentView "gameView" を使用して SurfaceView を拡張し、スレッドを使用してゲームへの永続的なループを作成します。私の onCreate() メソッドは

public class mainclass extends Activity {
GameView game;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    game = new GameView(this);
    setContentView(game);
}

クラッシュログキャットは

05-09 09:35:06.378: W/dalvikvm(9664): threadid=1: thread exiting with uncaught exception (group=0x40015560)
05-09 09:35:06.388: E/AndroidRuntime(9664): FATAL EXCEPTION: main
05-09 09:35:06.388: E/AndroidRuntime(9664): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
05-09 09:35:06.388: E/AndroidRuntime(9664):     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:460)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:359)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:385)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at superBill.Mbiz.Egypt.GameView.<init>(GameView.java:87)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at superBill.Mbiz.Egypt.SuperBillActivity.onCreate(SuperBillActivity.java:20)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at android.os.Looper.loop(Looper.java:130)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at android.app.ActivityThread.main(ActivityThread.java:3683)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at java.lang.reflect.Method.invokeNative(Native Method)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at java.lang.reflect.Method.invoke(Method.java:507)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-09 09:35:06.388: E/AndroidRuntime(9664):     at dalvik.system.NativeStart.main(Native Method)

注: このクラッシュは 2 回目に発生しますが、3 回目は問題ありません。4 回目は問題ありません。5 回目は問題ありません。

4

2 に答える 2

1

GameView の surfaceCreated メソッドでは、ゲームスレッドを再作成する必要があります。これは、surfaceDestroyed メソッドで gamethread.join() を使用して終了させる可能性が高いためです。このようなもの:

@Override
public void surfaceCreated(SurfaceHolder holder) {
    if (gamethread.getState() == Thread.State.TERMINATED) {
        gamethread = new GameThread(getHolder(), this);
        gamethread.setRunning(true);
        gamethread.start();
    } else if (gamethread.getState() == Thread.State.NEW) {
        gamethread.setRunning(true);
        gamethread.start();
    }
}
于 2012-05-08T15:17:42.550 に答える
0

@dymmeh: 私のコードは

@Override
          public void surfaceDestroyed(SurfaceHolder holder) 
        {
            boolean retry = true;
            mythread.setRunning(false);
            while (retry) {

                   try {
                            mythread.join();
                            retry = false;
                       } catch (InterruptedException e) {
                   }
            }
     }

そして、あなたが言ったことの原因は、私はそれを

    @Override
          public void surfaceDestroyed(SurfaceHolder holder) 
        {
            mythread.setRunning(false);
            System.exit(0);
        }

今、すべてがうまくいっています、ありがとう!

于 2012-05-10T07:49:41.603 に答える