Bilder zu groß, App stürzt ab?!

K

Knoxxx

Fortgeschrittenes Mitglied
0
Hallo,

ich benutze für meine App jpg und png Bilder (640x480), die jeweils nicht größer als 180KB sind. Trotzdem scheint das noch zu viel zu sein. Die App stürzt deswegen immer ab. Muss ich die Bilder noch weiter verkleinern (geht das überhaupt?) oder muss ich was in meinem Code ändern?

VG
Knoxxx
 
Hallo,
woher nimmst du die "Idee", dass die Bilder zu groß sein sollten? Also auf praktisch jedem halbwegs "neuem" Gerät (ich zähle jetzt mal alles ab Galaxy S1 als "halbwegs neu") schafft es ein Webbrowser Bilder in einer höheren Auflösung darzustellen, als du es bei deiner App vor hast. Somit rate ich einfach mal ins Blaue und sage, dass dein Code einen anderen Fehler hat.

"Was, wo, wie und warum" sind anhand der von dir mitgegebenen Infos praktisch unmöglich festzustellen.

Hilfreich wären:
-Logcatausgabe
-Fehlermeldung
-und ggf. ein Teil deines Codes

:)
 
Er wird es nie lernen.....
 
Ich gehe davon aus, weil die App fehlerfrei läuft, wenn ich andere "magere" Bilder benutze...
 
DagobertDokate schrieb:
Er wird es nie lernen.....

stimmt! :D

HerestoFAIL.jpg
 
  • Danke
Reaktionen: markus.tullius
Wie gesagt stürzt die App nur ab, wenn ich die genannten Bilder benutze. Was also mache ich falsch. Kann man diese Bilder noch mehr komprimieren o.ä.?
 
@Knoxxx
Bitte Logcat Ausgabe - ohne gibt es keine Hilfe; oder sollen wir uns durchraten?
 
Ich habe die Bilder gar nicht in den Java-Code eingebunden. Sie sind nur in der XML definiert?! Und der Fehlercode ist ein "OutOfMemory" ?!
 
Ballerst du den RAM mit unzähligen Bitmap-Instanzen voll? Evtl. Ressourcen freigeben! Aus VB.net kenne ich das auch mit manchen Images, die "defekt" sind, Windows schafft es diese korrekt darzustellen, aber erstelle ich von dem Image eine Instanz, knallt es dann(OutOfMemory). Öffne das Image im ImageEditor deiner Wahl z.B. Paint, drücke [STRG + A], [STRG +C], neues leeres Bild erstellen [STRG +V] , speichern und erneut versuchen.
 
Zuletzt bearbeitet:
Dein Problem ist ganz einfach. Jedes deiner Bilder ist ein komprimiertes Bitmap. Damit Android etwas mit dem Bild anfangen kann, muss es dein Bild entpacken. Das braucht Speicherplatz. Wenn du nur ein Bild entpackst, ist das kein Problem. Wenn aber recht schnell viele Bilder entpackt werden, erreichst du relativ schnell die Grenzen deiner VM. Spricht du müllst sie so schnell mit Bilder voll, dass sie nicht mehr dynamisch die Größe der VM anpassen kann.

Das Resultat: OutOfMemory.

Lösungsweg:

Du lädst die Bilder langsamer in den Speicher, und gibst alle Bilder und sonstige Objekte so schnell wie möglich für den GC frei.

Dabei hilft es natürlich in der Doku von Android zu lesen:
Loading Large Bitmaps Efficiently | Android Developers

Ein Vorteil wäre es natürlich, sich mit den Grundlagen der Programmierung vertraut zu machen.

Ich gehe davon aus, weil die App fehlerfrei läuft, wenn ich andere "magere" Bilder benutze...
ist natürlich ein Brüller. Ich hoffe dein Programm hat eine Waage. ;)

Schau mal dort nach:
Bildkompression

Eine genauere Fehlerbeschreibung würde auch helfen.
 
  • Danke
Reaktionen: ui_3k1
Ich habe eine Art Fotoalbum. In jeder Activity ist ein Foto. Ich habe 80 Fotos und somit 80 Activities. Wie gesagt kommt es irgendwann immer zu OutOfMemory....In den Java-Code habe ich die Bilder noch nicht aufgenommen, weil ich nicht kapiere wie das geht...

Code:
   package com.example.xxx;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;

public class PictureOne extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pictureone);}

public void Picture0 (View view){
    Intent i = new Intent(this, PageZero.class); startActivity(i);}}

public void Picture2 (View view){
    Intent i = new Intent(this, PageTwo.class);             
        startActivity(i);}}
Code:
 <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >



    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_centerInParent="true"
        android:layout_marginLeft="14dp"
        android:src="@drawable/pic1" />

    <ImageView
        android:id="@+id/imageView4"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:src="@drawable/left" 
        android:onClick="Picture0"/>

    <ImageView
        android:id="@+id/imageView4"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:src="@drawable/right" 
        android:onClick="Picture2"/>

</RelativeLayout>
VG
Knoxxx
 
Oo, 80 activities?

Ein bissl sehr viel oder nicht? Du solltest dein Konzept ernsthaft überdenken. Schau dir mal die Listview an, dort würde ich Thumbnails von Images reinladen, dann bei onItemSelected/onItemClick eine Activity starten der du den Pfad zum Image mitgibst. Dann brauchst du nur eine Activity und das ganze Projekt bleibt überschaubar und bleibt dynamischer.
 
Zuletzt bearbeitet:
Knoxxx schrieb:
Ich habe eine Art Fotoalbum. In jeder Activity ist ein Foto. Ich habe 80 Fotos und somit 80 Activities. Wie gesagt kommt es irgendwann immer zu OutOfMemory.
Bis du des Wahnsinn? Kein Wunder, dass ein OutOfMemory auftritt. Du hast viel zu viel Bilder und Activities im Speicher. Du solltest die Anzahl begrenzen, am besten mit ein ViewPager.

Hier sind ein paar Links, mit Codebeispiel:

Displaying Bitmaps in Your UI | Android Developers
Using ViewPager for Screen Slides | Android Developers
Horizontal View Swiping with ViewPager, Updated | Android Developers Blog


----

Nachtrag: Eine Activity - 80 Bilder solltest du vermeiden. Der ViewPager hat den Vorteil, dass nicht alle Bilder geladen werden müssen. Es werden nur die Bilder geladen, die auch wirklich angezeigt werden. Das ist wesentlich Speicher sparend.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: ui_3k1
ok, danke!
@Murdock: Wenn ich dann aus der Liste ein Bild auswähle und mir dann das nächste Bild anschaue, muss ich dann immer wieder zurück in die ListView?
 
Ja, aber der Use-Case ist nicht sehr elegant.
Ein normaler User würde eine Darstellung, die an der Galerie App von Android angelehnt ist, erwarten. Insbesondere weil Google den ViewPager als Standrad für eine Anwendung mit Galerie favorisiert.
 
Zuletzt bearbeitet:
Zangsläufig müsstest du nicht zurück zur ListView, es hängt von dir ab, du kannst Daten beim starten der Activity übergeben, es gibt Services die du mitlaufen lassen kannst wegen der Daten.(Weiss nicht on das so der richtige weg wäre)

Ich würde doch eher den rat von markus.tullius(siehe sein Nachtrag) befolgen. Nutze einen ViewPager, ist wirklich nicht schwer damit umzugehen.
 
Ok. Und was ist eigentlich, wenn man Activities hat, die nicht nur Bilder darstellen, sondern auch irgendwelche Animationen oder so? Wenn ich also bspw 50 verschiedene Animationen habe. Muss ich dann nicht dafür jeweils eine extra Activity starten? Schließlich unterscheiden sich diese Activities in ihrem Java-Code. Also bspw habe ich auf der ersten Seite einen tanzenden Clown und auf der nächsten Seite eine andere Animation. Muss ich dann nicht für den Clown eine eigene Activity starten. Und dann eine neue Activity für die zweite Seite etc?
 
Das heißt also, dass ich eine Activity habe. Und in diese eine Activity binde ich die 80 verschiedenen Seiten meiner App ein? D.h. also, dass ich einen Code brauche, der definiert, wann die nächste Seite anfängt und was auf dieser jeweiligen Seite "passiert"?!
 

Ähnliche Themen

S
Antworten
8
Aufrufe
512
swa00
swa00
Manny87
  • Manny87
Antworten
11
Aufrufe
166
swa00
swa00
R
  • Robby1950
2
Antworten
23
Aufrufe
1.022
Robby1950
R
Zurück
Oben Unten