2016-09-19 3 views
1

in MainActivity Ich setze Bild meiner Bildansicht Picasso Unter Verwendung dieses Codes auf OnCreate:Recycling und die Wiederverwendung von Imageview

ivLogo = (ImageView) findViewById(R.id.backimage); 
    Picasso.with(getApplicationContext()).load(R.drawable.background).fit() 
      .into(ivLogo); 

und Recycling in On OnDestroy Funktion:

((BitmapDrawable)ivLogo.getDrawable()).getBitmap().recycle(); 

Ich habe meinen Imageview Recycle Um OutOfMemory Fehler zu vermeiden.

, aber wenn ich auf diese Tätigkeit von einem anderen wieder durch diesen Code:

 Intent it = new Intent(WorldChose.this, MainMenu.class); 
     // it.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(it); 
     overridePendingTransition(R.anim.from_middle, R.anim.to_middle); 
     finish(); 

ich diesen Fehler:

09-19 15:04:32.465: E/AndroidRuntime(2112): java.lang.IllegalArgumentException: Cannot draw recycled bitmaps 

Antwort

0

Sie können keine recycelten Bitmap verwenden. Und es scheint, dass Sie das tun. Zuerst recyceln Sie die Bitmap, und dann binden Sie sie, wenn der Benutzer zu der Aktivität zurückkehrt.

Aus Dokumentation:

Caution: You should use recycle() only when you are sure that the bitmap is no longer being used. If you call recycle() and later attempt to draw the bitmap, you will get the error: "Canvas: trying to use a recycled bitmap".

Managing Bitmap Memory

Edit: auf Android 3.0 und höher gibt es nicht so viele Gründe ist die Rückführung zu nennen. (Lesen Sie doc)

+0

Ich mag einen Imageview nach dem Recycling wieder zu verwenden und diese Tätigkeit Finishing, warum es nicht möglich, sein gleiches wie eine Aktivität von Anfang an zu starten ist es nicht? –

+0

Sie sprechen über die Wiederverwendung von ImageView, aber die Recyclingmethode ist NUR für die Bitmap. – adalPaRi

+0

Wenn Sie Bitmap recyceln, bedeutet dies, dass Sie nicht mehr verwenden werden, bis die App vollständig zerstört und neu geöffnet wurde. Also, was du machst, ist nicht dasselbe wie von Anfang an zu laufen. – adalPaRi

0

Erstens, nach Ihrem Code, rufen Sie tatsächlich recycle-Methode für das Bitmap-Objekt.

Zweitens, wenn Sie ein Bitmap recyceln, kann sie nicht mehr verwendet werden, können Sie den Quellcode überprüfen:

private void checkRecycled(String errorMessage) { 
    if (mRecycled) { 
     throw new IllegalStateException(errorMessage); 
    } 
} 

Dies ist Code-Schnipsel in Bitmap-Quellcode, und es wird zunächst aufgerufen werden in den meisten Bitmap-Operationsmethoden.

Last und nicht zuletzt Recycling-Verfahren hat eigentlich nichts mit dem Gedächtnis Recycling, wenn die OS API-Ebene oben ist 11.

+0

Und Sie müssen sich nicht zu sehr um das OOM-Problem sorgen, besonders wenn Sie den Picasso verwenden. Weil es Ihnen gelingt, den Spitzenspeicher zu kontrollieren. – Sherlock

Verwandte Themen