- Forum-Beiträge: 43
06.11.2016, 11:01:51 via Website
06.11.2016 11:01:51 via Website
Hallo,
ich programmiere momentan eine neue Spiele-App mit mehreren Levels und habe das Problem dass mein Arbeitsspeicher voll läuft. Da ich eher aus der C-Programmierung komme und in Java noch nicht so erfahren bin, hoffe ich dass mir jemand von euch sagen kann wo mein Fehler liegt.
Zur App:
Ich habe 3 Activities:
A: Level-Übersicht
B: hier drin läuft das Spiel selbst (GameActivity)
C: Ergebnis-Ansicht (ResultActivity)
Aus Activity A starte ich B wie folgt:
Intent myIntent = new Intent(this, GameActivity.class);
myIntent.putExtra("levelResource", list.get(position).resourceID);
myIntent.putExtra("levelNumber", list.get(position).number);
this.startActivity(myIntent);
Activity B sieht wie folgt aus:
public class GameActivity extends AppCompatActivity {
View gameView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Hide the status bar.
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
Intent intent = getIntent();
int levelResource = intent.getIntExtra("levelResource", R.raw.level1);
int levelNumber = intent.getIntExtra("levelNumber", 1);
gameView = new gameView(this, null, levelResource, levelNumber);
setContentView(gameView);
Log.v("level", "created");
}
@Override
protected void onDestroy()
{
super.onDestroy();
gameView = null;
Log.v("level", "destroy");
}
}
so weit so gut, die gameView-Klasse lädt nun alles und zeichnet das Spiel auf den screen. Die Klasse benötigt für die ganzen Grafiken etwa (10-20MB RAM).
Wenn das Spiel nun vorrüber ist, erfolgt innerhalb der gameView-Klasse folgender Aufruf:
Intent myIntent = new Intent(context, ResultActivity.class);
myIntent.putExtra("levelNumber", levelNumber); //parameters
myIntent.putExtra("reachedPoints", gameEngine.getPoints()); //parameters
context.startActivity(myIntent);
context.finish();
Wie ich im Log sehe, wird nun die onDestroy() der Activity B aufgerufen.
Und hier verstehe ich nun eines nicht:
Obwohl ich gameView zu null setze (und somit keine Referenzierung mehr existieren kann), scheint diese Klasse noch im Speicher zu bleiben. Dies sehe ich am Android Monitor in Android Studio. Dies führt zu dem Problem, dass der Speicher immer voller wird. Denn jedes neue Level was ich aus Activity A starte kommt im Speicher hinzu, die alten werden aber nicht beseitigt. Irgendwann, wenn man mehrere Level gespielt hat, ist der Speicher voll und die App stürzt ab, weil sie keinen neuen Speicher mehr bekommt.
Was mache ich hier falsch? Sollte gameView=null nicht den verwendeten Speicher dieser Klasse, und aller ihrer Member wieder frei geben?
Activity B ist definitiv die einzige Activity die mit gameView irgendwas macht.
— geändert am 06.11.2016, 11:03:33
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.