Android, aus dem Speicher in die benutzerdefinierte Ansicht

Ich bin stress-testing eine app, die besteht aus einer Reihe von benutzerdefinierten Ansichten (3 in), die in ein frameLayout.

Nur zwei gehalten werden, zu einer Zeit, obwohl. Ich habe die Ansicht 1, Ansicht hinzufügen zwei, animieren out 1 und animieren in 2, dann entfernen Sie 1, und Umgekehrt, wenn ich gehen bacward durch HDie Ansichten.

Jede Ansicht dann lädt eine große Menge von Bilddaten, wenn es erstellt wird, mithilfe der folgenden Methode:

mBmp[background] = BitmapFactory.decodeStream(context.getAssets().open("view1_background.png"));

Unten ist ein Beispiel meiner Ansicht, code-switching, das Umschalten nach vorne, auf die nextView.

currView.startAnimation(AnimClass.outToLeftAnimation(null));
    intView++;
    nextView = ViewFactory.getInstance(this, intView, viewInitializer);
    mainLayout.addView(nextView, 0);
    nextView.startAnimation(AnimClass.inFromRightAnimation(this));
    mainLayout.removeViewInLayout(currView);
    currView = nextView;
    nextView = null;

viewInitializer ruft eine Benutzerdefinierte Ansicht abhängig von der intView-und instanziiert es, die lädt dann die Bilder mithilfe der oben beschriebenen Methode.

Das problem ist, dass wenn ich wechseln die Ansichten schnell genug, ich kann es verursachen, zu stoppen, zu halten (auch wenn ich deaktivieren Sie die Tasten, bis die slide-out-animation abgeschlossen ist) und nach ein paar Schalter, die ich verlieren die meisten Bilder in einer Ansicht und nur am Ende mit ein oder zwei der kleinsten Bilder immer noch da. Es zeigt keine Fehler, wenn dies geschieht, mit Ausnahme der folgenden Nachrichten (eine pro Bild, in der Ansicht):

01-27 13:52:00.730: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264
01-27 13:52:01.011: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 425984
01-27 13:52:01.011: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 1187840
01-27 13:52:01.011: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264
01-27 13:52:01.093: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264
01-27 13:52:01.128: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 425984
01-27 13:52:01.144: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 1187840
01-27 13:52:01.179: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264
01-27 13:52:01.245: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 425984
01-27 13:52:01.261: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264
01-27 13:52:01.277: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 1187840
01-27 13:52:01.343: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264
01-27 13:52:01.363: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 425984
01-27 13:52:01.409: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 1187840
01-27 13:52:01.429: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264
01-27 13:52:01.511: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264

Wenn ich die Ansichten wechseln, es macht das gleiche auf jeder Ansicht. Es scheint mir, dass meine Ansicht Umschalten-code nicht freigeben die Ansichten, wenn Sie entfernt oder die Bilder (bitmaps) nicht als aufgehoben, sobald die Ansicht " entfernt wird.

Wenn dann benutze ich eine Absicht zur Rückkehr zu meiner Haupttätigkeit bekomme ich die folgende:

Surface  E  Surface (identity=4810) requestBuffer(0, 00000033) returneda buffer with a null handle
Surface  E  getBufferLocked(0, 00000033) failed (Out of memory)
Surface  E  dequeueBuffer failed (Out of memory)
ViewRoot  E  OutOfResourcesException locking surface
ViewRoot  E  android.view.Surface$OutOfResourcesException
ViewRoot  E     at android.view.Surface.lockCanvasNative(Native Method)
ViewRoot  E     at android.view.Surface.lockCanvas(Surface.java:314)
ViewRoot  E     at android.view.ViewRoot.draw(ViewRoot.java:1363)
ViewRoot  E     at android.view.ViewRoot.performTraversals(ViewRoot.java:1172)
ViewRoot  E     at android.view.ViewRoot.handleMessage(ViewRoot.java:1749)
ViewRoot  E     at android.os.Handler.dispatchMessage(Handler.java:99)
ViewRoot  E     at android.os.Looper.loop(Looper.java:123)
ViewRoot  E     at android.app.ActivityThread.main(ActivityThread.java:4627)
ViewRoot  E     at java.lang.reflect.Method.invokeNative(Native Method)
ViewRoot  E     at java.lang.reflect.Method.invoke(Method.java:521)
ViewRoot  E     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
ViewRoot  E     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
ViewRoot  E     at dalvik.system.NativeStart.main(Native Method)

Kann jemand empfehlen, wo ich vielleicht schief gegangen?

EDIT: finde nicht die genaue Ursache, aber ich löste das problem durch ausführen einer garbage sammeln zwischen wechseln von Ansichten.

  • Hamid , Hast du versucht, mit SoftReference?
  • Nein, habe ich nicht versuchen, weil aus meinem Verständnis dies würde es ermöglichen, das system zu entfernen, meine Bilder aus dem Speicher, während ich bin mit Ihnen? Ist dies ein korrektes Verständnis? Es ist nicht akzeptabel, dass es zum entfernen der Bilder, während mein Blick immer noch im Fokus.
InformationsquelleAutor Hamid | 2011-01-27
Schreibe einen Kommentar