Image Adapter ListView Problem mit Speicher

  • 4 Antworten
  • Letztes Antwortdatum
DagobertDokate

DagobertDokate

Dauer-User
137
Hallo liebe Leute,
Da ich nun wieder etwas Zeit habe, wollte ich mal meine StreifenhörnchenWallpaperApp weiter machen. Jedoch habe ich immer noch ein essentielles Problem. Ich stehe noch mit den Bilder auf Kriegsfuß.
Also ich habe mehrer hochauflösende Bilder (imo 10). Jetzt würde ich gerne eine ListView mit diesen Bildern als vorschau machen. Jedoch bekomme ich dabei immer ein
Fehler. Daraus schließe ich einfach mal das die Speicherverwaltung meiner Bilder unter aller Kanone ist ;)
Aktuell liegen die Bilder im Ordner "res/raw".
Dazu habe ich mir Folgenden ImageAdapter gebastelt:

Code:
public class ImageAdapter extends BaseAdapter {
	
		private Context mContext;
		private int[] id = { R.raw.horn1, R.raw.horn2, R.raw.horn3, R.raw.horn4,
	//			R.raw.horn5, R.raw.horn6, R.raw.horn7, R.raw.horn8, R.raw.horn9,
	//			R.raw.horn10 
				};
	
		public ImageAdapter(Context context) {
			this.mContext = context;
		}
	
		public int getCount() {
			return id.length;
		}
	
		public Object getItem(int position) {
			return id[position];
		}
	
		public long getItemId(int position) {
			return position;
		}
	
		public View getView(int position, View convertView, ViewGroup parent) {
			ImageView imageView = null;
			if (convertView == null) {
				imageView = new ImageView(mContext);
				imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
				imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
				imageView.setPadding(8, 8, 8, 8);
			} else {
				imageView = (ImageView) convertView;
			}
			Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), id[position]);
			imageView.setImageBitmap(bitmap);
	
			return imageView;
		}
	}

Jedoch bekomme ich schon bei 2 Bildern den Fehler...
Was mache ich falsche... ? Ich hab echt schon einiges probiert....

mfg. Dagobert
 
Du solltest entweder die Bilder nochmal kleiner irgendwo in das apk legen, oder nur verkleinerte Bitmap Objekte im Speicher halten.
Bei dir wird aktuell das hochaufgelöste Bild geladen und nur bei der Anzeige skaliert. Im Speicher ist aber immer noch die große Variante.

Hier ist ein Link in dem erklärt wird wie du Bitmaps in place verkleinerst:
Resizing a Bitmap « Think Android

Und in deine View packst du dann nur noch das verkleinerte Bitmap.
 
Ja das hab ich auch schon mal versucht ;)
Wenn ich den Code so änder:
Code:
Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(),
				id[position]);
imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 10, 10, true));
bitmap.recycle();
Bekomme ich trotzdem nicht alle Bilder geladen =/ und der gleiche Fehler passiert immer noch.
7 Bilder bekomme ich so geladen... danach ist Schluss, nur erkennen tut man nichts :D

Also ich bin für weitere Vorschläge offen und dankbar =)

mfg. Dagobert
 
mach mal eine ausgabe wie oft dein getview aufgerufen wird.

das passiert extrem oft und jedesmal wird ein image geladen.

speicher das geladene doch irgendwo mit einer softreference und nimm das her, falls du es schonmal geladen hast.
 
swordi schrieb:
mach mal eine ausgabe wie oft dein getview aufgerufen wird.

das passiert extrem oft und jedesmal wird ein image geladen.

speicher das geladene doch irgendwo mit einer softreference und nimm das her, falls du es schonmal geladen hast.
Ja, das hab ich auch vor... aber sollte das ganze nicht erst mal ohne Cache laufen bevor ich noch weiteren "schnick-schnack" einbauen, damit ich erstmal das eine Problem in den griff bekommen ?

mfg. Dagobert

Der ursprüngliche Beitrag von 17:44 Uhr wurde um 18:01 Uhr ergänzt:

Ich habe jetzt mal so einen kleinen Cache eingebaut:
Code:
cache = new WeakHashMap<Integer, Bitmap>();
Code:
	public View getView(int position, View convertView, ViewGroup parent) {
		ImageView imageView = null;
		int id = this.id[position];
		if (convertView == null) {
			imageView = new ImageView(mContext);
			imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
			imageView.setPadding(5, 5, 5, 5);
			
		} else {
			imageView = (ImageView) convertView;
		}
		
		if(cache.containsKey(id)) {
			imageView.setImageBitmap(cache.get(id));
		} else {
			Log.d(TAG, "scale image " + id);
			Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), id);
			bitmap = Bitmap.createScaledBitmap(bitmap, 150, 150, true);
			cache.put(id, bitmap);
			imageView.setImageBitmap(bitmap);
		}
		
		return imageView;

mfg. Dagobert
 
Zurück
Oben Unten