2012-06-09 4 views
1

나는 안드로이드 게임을 개발 중이며 메인 메뉴를 추가했습니다. 이는 별도의 활동입니다. 따라서 메뉴에서 '새 게임'버튼을 클릭하면 게임 활동에 대한 새로운 의도가 열립니다.생성 된 활동에 대한 참조를 보유하고 있습니까?

내 문제는 사용자가 '뒤로'를 치면 게임을 닫고 기본 메뉴로 돌아갑니다. '새로운 게임'을 다시 클릭하면 충돌이 발생합니다.

저는 게임의 두 번째 버전을 만들고 메모리가 부족한 것으로 생각합니다. 메뉴에서 게임 활동의 복사본을 잡고 다시 '새로운 게임'을 클릭하면 다시 열어야합니까? 아니면 이것을 할 수있는 더 쉬운 방법이 있습니까?

내 "새로운 게임"버튼 청취자는 다음을 수행합니다. (IslandGame이 주요 게임 클래스입니다. 새 게임을 시작하거나 이전 게임을로드할지 여부와 시작 레벨을 지정하는 것입니다.

ButtonNewGame.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) {     
      Bundle bundle = new Bundle(); 
      bundle.putString("RESTORE", "NEW"); //in the restore key, say we want a new game 
      bundle.putInt("CAMPAIGN", 1); //start in campaign #1 

      Intent intent = new Intent(Intent.ACTION_RUN); 
      intent.putExtras(bundle); 
      intent.setClassName(thisActivity, IslandGame.class.getName()); 
      startActivity(intent); 
     }   
    }); 

로그 캣은 다음과 같습니다

06-09 17:42:34.199: E/dalvikvm-heap(239): 147456-byte external allocation too large for this process. 
06-09 17:42:34.199: E/(239): VM won't let us allocate 147456 bytes 
06-09 17:42:34.209: D/AndroidRuntime(239): Shutting down VM 
06-09 17:42:34.209: W/dalvikvm(239): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 
06-09 17:42:34.219: E/AndroidRuntime(239): Uncaught handler: thread main exiting due to uncaught exception 
06-09 17:42:34.249: E/AndroidRuntime(239): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dylan.island/com.dylan.island.IslandGame}: android.view.InflateException: Binary XML file line #37: Error inflating class <unknown> 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.os.Looper.loop(Looper.java:123) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.app.ActivityThread.main(ActivityThread.java:4363) 
06-09 17:42:34.249: E/AndroidRuntime(239): at java.lang.reflect.Method.invokeNative(Native Method) 
06-09 17:42:34.249: E/AndroidRuntime(239): at java.lang.reflect.Method.invoke(Method.java:521) 
06-09 17:42:34.249: E/AndroidRuntime(239): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
06-09 17:42:34.249: E/AndroidRuntime(239): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
06-09 17:42:34.249: E/AndroidRuntime(239): at dalvik.system.NativeStart.main(Native Method) 
06-09 17:42:34.249: E/AndroidRuntime(239): Caused by: android.view.InflateException: Binary XML file line #37: Error inflating class <unknown> 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.view.LayoutInflater.createView(LayoutInflater.java:513) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:565) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.view.LayoutInflater.rInflate(LayoutInflater.java:618) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.view.LayoutInflater.rInflate(LayoutInflater.java:621) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.view.LayoutInflater.rInflate(LayoutInflater.java:621) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.view.LayoutInflater.inflate(LayoutInflater.java:407) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
06-09 17:42:34.249: E/AndroidRuntime(239): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.app.Activity.setContentView(Activity.java:1622) 
06-09 17:42:34.249: E/AndroidRuntime(239): at com.dylan.island.IslandGame.onCreate(IslandGame.java:76) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 
06-09 17:42:34.249: E/AndroidRuntime(239): ... 11 more 
06-09 17:42:34.249: E/AndroidRuntime(239): Caused by: java.lang.reflect.InvocationTargetException 
06-09 17:42:34.249: E/AndroidRuntime(239): at com.dylan.island.IslandView.<init>(IslandView.java:1983) 
06-09 17:42:34.249: E/AndroidRuntime(239): at java.lang.reflect.Constructor.constructNative(Native Method) 
06-09 17:42:34.249: E/AndroidRuntime(239): at java.lang.reflect.Constructor.newInstance(Constructor.java:446) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.view.LayoutInflater.createView(LayoutInflater.java:500) 
06-09 17:42:34.249: E/AndroidRuntime(239): ... 23 more 
06-09 17:42:34.249: E/AndroidRuntime(239): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.graphics.Bitmap.nativeCreate(Native Method) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.graphics.Bitmap.createBitmap(Bitmap.java:468) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.graphics.Bitmap.createBitmap(Bitmap.java:435) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:462) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:346) 
06-09 17:42:34.249: E/AndroidRuntime(239): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:372) 
06-09 17:42:34.249: E/AndroidRuntime(239): at com.dylan.island.IslandView$IslandThread.initimages(IslandView.java:435) 
06-09 17:42:34.249: E/AndroidRuntime(239): at com.dylan.island.IslandView$IslandThread.beginLevel(IslandView.java:220) 
06-09 17:42:34.249: E/AndroidRuntime(239): at com.dylan.island.IslandView$IslandThread.<init>(IslandView.java:215) 
06-09 17:42:34.249: E/AndroidRuntime(239): ... 27 more 

답변

0

나는이 게임의 두 번째 버전을 시도하고, 메모리 부족 생각합니다.

귀하는 틀림 없습니다. 게임 활동을 제대로 끝내면 첫 번째 버전이 사라져야하기 때문에 두 번째 버전을 만들어야합니다.

게임 활동의 사본을 메뉴에 보관하고 '새 게임'을 다시 누르면 다시 열어야합니까?

일반적으로 이것은 여러 가지 이유로 끔찍하게 나쁜 것으로 간주됩니다. 이 중 가장 중요한 것은 컨텍스트로 인한 메모리 누수입니다.

또는 더 쉬운 방법이 있습니까?

게임 활동을 singleTask 또는 singleInstance로 정의 할 수 있습니다. 이 문제는 (현재) 메모리 버그를 수정하는 해결책이 아니라는 점입니다. SingleTasks는 여러 인스턴스 응용 프로그램과 다르게 프로그래밍되며 다른 고려 사항이 있습니다. 문제는 메모리가 처음에 사용했다는 사실에있다 때문에,이 길을 가기 전에, 나는 확실히 다음을 검토 것 :

  1. 모든 자원이 해제되어 있는지 확인합니다. 여기서 특히주의해야 할 사항은 뷰에 대한 정적 참조입니다. 가지고 있다면 청소하십시오.

  2. 모든 비트 맵이 재활용되었는지 확인하십시오. 경우에 따라 비트 맵의 ​​크기를 조정할 때 원본이 뒤에 남겨집니다. 종종 어리석은 감시. 한번보세요. :)

  3. 파일에 액세스하는 경우 해당 파일이 닫혀 있는지 확인하십시오. 거의 문제는 없지만 항상 시도해 볼만한 가치가 있습니다.

  4. 게임 활동이 끝난 후 System.gc() 호출을 추가하십시오. 이것은 리소스의 주요 릴리스 후에 정말 도움이 될 수 있습니다. 불행히도, 보장 할 수 없습니다. 귀하의 경우 메인 메뉴의 onResume()에서 가장 좋을 수 있습니다.

일단 모두 다 써 버리면 singleTask 라우트는 단순히 구현을 선택하는 것입니다. 이 도움이

희망,

FuzzicalLogic

+0

덕분에 - 자체가 매우 비 대한 경우에도 이미지를, 나는 자신의 크기를 줄일 수있다 - 나는 확실히 일부 메모리를 청소와 함께 할 수 있습니다. 그러나, 나는 나의 '게임'활동이 끝나기를 기대하지 않을 것입니다. 메뉴에서 돌아올 수 있습니까? 예 : 누군가가 메뉴로 돌아 가기 위해 뒤로 밀린 다음 일부 설정을 변경 한 다음 그들이 플레이하고있는 게임의 중간으로 돌아왔다면? – gedditoffme

+0

알았어 - 실수로 '뒤로'푸시를 해결하는 확인 창이 추가되었습니다. 잠시 동안 리소스를 해제하려고 시도한 후에 destroy() 메서드에서 모든 비트 맵 객체를 재활용하는 루프를 추가했습니다. 그것은 마침내 오류를 끝내는 것처럼 보였다. 당신의 도움을 주셔서 감사합니다. – gedditoffme

+0

당신은 절대적으로 환영합니다. 다행 이니 다행 이네. 비트 맵을 많이 사용하는 응용 프로그램은 처음에는 이러한 유형의 오류가 발생합니다. –

0

이 빵을 선호하지 마십시오

Intent intent = new Intent(YourCurrentActivity.this, IslandGame.class); 
intent.putExtra("Restore", "NEW"); 
intent.putExtra("CAMPAIGN", 1); 
startActivity(intent); 

시도 쉬운 조작을위한 lde.

편집 : 그리고 다른 활동의에서 onCreate 내부 :

Bundle extras = getIntent().getExtras(); 
    if(extras !=null && extras.getInt("CAMPAIGN") == 1){ 
     newGame(); 
    } 
    else{ 
     loadGame(extras.getInt("gameId")); 
     //or whatever 
    } 
1

난 당신이 게임의 주요 활동을 파괴하고 메뉴 활동에 올 때 게임에 사용 된 모든 이미지를 재활용 필요가 있다고 생각 java.lang.OutOfMemoryError: bitmap size exceeds VM budget

을 방지하기 위해 . 당신이 점심을 다시 뒤로 버튼의 기능을 대체 할 수 있습니다

http://android-developers.blogspot.co.uk/2009/01/avoiding-memory-leaks.html

Strange out of memory issue while loading an image to a Bitmap object

OutofMemoryError: bitmap size exceeds VM budget (Android)

0

: 이미지를 많이 사용하는 경우

좋은 연습이 링크를 참조하시기 바랍니다 주요 활동이며 게임 활동의 최상단에 설정하고 게임으로 돌아갈 때도 마찬가지입니다. 그러나 사용자가 게임 시작 버튼을 다시 누르라는 것을 모르기 때문에 나쁜 실행입니다. 대신 사용 된 모든 리소스를 onDestroy 메서드에서 해제하고 사용자가 다시 돌아올 때 새로운 인스턴스를 점심으로 시도하십시오. 또한 사용하는 비트 맵의 ​​크기를 최소화하려고 시도하십시오. 예를 들어 9 패치를 시도하십시오.

0

Android Manifest 파일에서 활동을 정의해야 인스턴스 하나만 만들 수 있습니다.

<activity 
    android:launchMode="singleTask"> 
관련 문제