[Programming] Activity LifeCycle - Wie "beende" ich die Activity meiner App? (Ressourcenfreigabe)

  • Antworten:9
  • Bentwortet
Noryon
  • Forum-Beiträge: 14

08.03.2012, 20:09:07 via Website

Hallo erstmal,

da ich nun schon länger privat am Programmieren bin, programmiere ich nun ein kleines Spiel (eine Art TowerDefense:V) für Android.
Nun habe ich das grundlegende des Spiels schon zum Laufen gebracht, aber was mich jetzt schon lange verfolgt ist:
"Wie beende ich meine App richtig?" bzw. "Wie gebe ich die Ressourcen richtig frei?"
Ich weiß natürlich, dass man seine App nicht wirklich beenden kann, aber möchte ich ja wenn ich die App wiederöffne kein Fehler bekommen und die App stürzt dann ab.
Derweil ist es so, dass ich nachdem ich meine App beendet habe, den TaskManager aufrufen und den Ram leeren muss. Ich habe mich natürlich informiert und bin soweit, dass ich in der onPause() Method meiner Activity die Ressourcen freigeben muss und in der onResume() Method wieder einelesen bzw. neu erzeugen muss. Zudem soll man natürlich Runnables und Threads freigeben.
Meine Activity macht im Grunde nur paar wesentliche Dinge: surfaceView kreieren und diese dann auch benutzen.
Diese surfaceView besitzt die ein Objekt meiner Klasse Simulation,welche das Spielgeschehen regelt und einen GameLoop (Thread), welcher die Aktualisierung und das Rendering aufruft. In der onSurfaceDestroyed() Method beende ich diesen Thread.
Ich habe jetzt schon viel im Internet rumgelesen ( SourceCodes, ForenEinträge, etc. ), aber konnte damit noch nicht mein Problem lösen.
Nun bin ich ratlos und versuche seit einigen Wochen meinen Fehler zu finden. Die Return-Taste von Android habe ich auch mal mit der finish() Method der Activity ausgestattet. War aber auch erfolglos. 8o
Falls jemand den SourceCode einiger oder aller Klassen benötigt schicke ich diese gerne. Den SourceCode der Activity füge ich im Folgendem als Anhang hinzu.

Vielen Dank und mit freundlichen Grüßen:)



Anhang: Source Code von der GameActivity

public class GameActivity extends Activity {

GameView gameView = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
setRequestedOrientation(0);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

super.onCreate(savedInstanceState);

gameView = new GameView(this);
setContentView(gameView);

}
//
// die Override Implementation lass ich mal weg, da ich dort nur super aufrufe
//
}

— geändert am 08.03.2012, 20:10:56

Antworten
Bastian Siewers
  • Forum-Beiträge: 9.729

08.03.2012, 21:05:03 via Website

Hallo Noryon, herzlich Willkommen hier bei AndroidPIT! :)

Ich verschiebe deinen Thread mal ins Entwickler-Forum, da findest du sicherlich besser Hilfe :)

Antworten
Noryon
  • Forum-Beiträge: 14

08.03.2012, 21:19:04 via Website

Vielen Dank
Tut mir leid, ich habe das Entwickler-Forum zuerst gar nicht bemerkt. :*)
So viele Unterforen =P

Antworten
Markus B.
  • Forum-Beiträge: 636

09.03.2012, 10:28:38 via App

Hi, wo ist denn genau dein Problem? Bekommst du eine Exception oder stürzt deine App ab?
Deine grundlegende Frage lässt sich nicht so einfach beantworten, da Speicher-Managment ein sehr komplexes Thema ist. Hier kommt es z.B. auf die konkrekte Implementierung auf deiner Seite an, welches Sdk du nutzt, wie du die Grafiken verwaltes usw.
Um dir zu helfen müssen mehr Infos her :-)

Gruß,
Markus

Antworten
Noryon
  • Forum-Beiträge: 14

09.03.2012, 21:19:16 via Website

Okay,
im Moment zeigt die App nach dem zweiten Start einen Blackscreen mit dem Titel an. (Ich hab schon eingies "rumversucht") Früher stürzte sie auch ab.
Das Sdk ist Android 2.2, also API 8.
Die Grafiken lade ich mit der Bitmapfactory aus dem drawable-nodpi ordner, dies geschieht in der surfaceView Klasse, welche diese Bitmaps dann der Simulationsklasse übergibt.

Wenn du Zeit und Lust hättest könnte ich dir auch den Source Code schicken, also für mehr Infos.

mfG

Antworten
Markus B.
  • Forum-Beiträge: 636

10.03.2012, 23:32:30 via Website

Hi,
also wenn ich deine App staten möchte fliegt mir das Teil gleich um die Ohren:

103-10 23:30:11.764: ERROR/AndroidRuntime(29394): FATAL EXCEPTION: Thread-11
2 java.lang.ArithmeticException: divide by zero
3 at panddha.pandemic.noryon.pandas.defense.Simulation.onDraw(Simulation.java:227)
4 at panddha.pandemic.noryon.pandas.defense.GameView.onDraw(GameView.java:55)
5 at panddha.pandemic.noryon.pandas.defense.GameLoop.run(GameLoop.java:28)
603-10 23:30:12.074: ERROR/global(29394): Deprecated Thread methods are not supported.
7 java.lang.UnsupportedOperationException
8 at java.lang.VMThread.stop(VMThread.java:85)
9 at java.lang.Thread.stop(Thread.java:1280)
10 at java.lang.Thread.stop(Thread.java:1247)
11 at panddha.pandemic.noryon.pandas.defense.GameView.surfaceDestroyed(GameView.java:41)
12 at android.view.SurfaceView.reportSurfaceDestroyed(SurfaceView.java:587)
13 at android.view.SurfaceView.updateWindow(SurfaceView.java:481)
14 at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:213)
15 at android.view.View.dispatchWindowVisibilityChanged(View.java:4027)
16 at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
17 at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
18 at android.view.ViewRoot.performTraversals(ViewRoot.java:782)
19 at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
20 at android.os.Handler.dispatchMessage(Handler.java:99)
21 at android.os.Looper.loop(Looper.java:130)
22 at android.app.ActivityThread.main(ActivityThread.java:3683)
23 at java.lang.reflect.Method.invokeNative(Native Method)
24 at java.lang.reflect.Method.invoke(Method.java:507)
25 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
26 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
27 at dalvik.system.NativeStart.main(Native Method)

Geht es dir nun um diese Fehler oder wie ?

Gruß,
Markus

Antworten
Noryon
  • Forum-Beiträge: 14

11.03.2012, 11:34:12 via Website

Hi,
der erste Fehler kam bei mir nicht vor, aber ich hab das Gestern bei nem adneren auc hentdeckt, der die App mal angeschaut hat. Anscheinend kann es passieren, dass die übergebene Zeit warum auch immer delta=0 ist. Dies habe ich mittlerweile behoben.
Ich glaube mir geht es um den 2. Fehler, dieser führt meines erachtens ja dazu, dass ich die App nicht nocheinmal starten kann oder istm ir vöölig unbekannt.

mfG

Antworten
Markus B.
  • Forum-Beiträge: 636

11.03.2012, 23:09:21 via Website

Hi,
deine GameLoop erbt von Thread und du nutzt die Methode stop() vom Thread.
Folgendes sagt die API dazu:

stop()
This method is deprecated. because stopping a thread in this manner is unsafe and can leave your application and the VM in an unpredictable state.

Somit solltest du das auf keinen Fall nutzten ! Üblicherweise werden solche Endlosschleifen durch ein Flag beendet, welcher dann dazuführt das der Thread automatisch endet.

Gruß,
Markus

Antworten
Noryon
  • Forum-Beiträge: 14

12.03.2012, 19:36:20 via Website

Vielen dank, ich werde das Projekt nochmal neu anfangen mit einem ordentlich FrameWork und soweiter, hab nun endlich ein Buch gefunden, wo alles ausführlich erklärt wird. Ich denke zudem, ich habe die Bilder vergessen zu disposen(); naja meine Fragen sind erstmal soweit beantwortet. Der thread kann geschlossen werden =P

mfG

Antworten