Hallo,
ich habe mal eine Frage zum Cachen von Bildern, per Forumssuche habe ich nichts passendes gefunden.
Ich habe eine App, die kleine und größere Bilder aus dem Internet herunterlädt und anzeigt. Das klappt auch alles wunderbar. Nun versuche ich mit (als global in der Hauptklasse definiert)
HashMap<String,SoftReference<Bitmap>> imagecache = new HashMap<String,SoftReference<Bitmap>>();
SoftReference<Bitmap> softreference;
Bitmap bitmap;
die kleinen Bilder zu cachen.
Damit kommen die Bilder in den Cache:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putIntArray("startids", startids);
bitmap = starttip1_view.getDrawingCache();
imagecache.put("starttip1", new SoftReference<Bitmap>(bitmap));
super.onSaveInstanceState(savedInstanceState);
}
Vorher wird natürlich in der onCreate-Methode folgendes ausgeführt:
In
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
if (hasFocus == true)
{
int breite = starttip1_view.getWidth();
int hoehe = starttip1_view.getHeight();
if ((int)(breite*1.3333333333333333333333) > hoehe) breite = (int)(hoehe*0.75);
hoehe = (int)(breite*1.3333333333333333333333);
LoadStartImages(breite, hoehe);
}
}
Alles anzeigen
wird die entsprechende Größe ermittelt und dann werden die Bilder wie folgt geladen (eigene externe Klasse):
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class ImageLoader extends AsyncTask<Void, Void, Bitmap> {
private static final String TAG = "ImageLoader";
ImageView iv;
URL url;
public ImageLoader(ImageView iv2, URL url2) {
iv = iv2;
url = url2;
}
@Override
protected Bitmap doInBackground(Void... unused) {
Bitmap bitmap = null;
try
{
URLConnection connection = url.openConnection();
HttpURLConnection httpConnection = (HttpURLConnection)connection;
int responseCode = httpConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream is = httpConnection.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
}
httpConnection.disconnect();
}
catch(MalformedURLException mue) {}
catch(IOException ioe) {}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bm) {
iv.setImageBitmap(bm);
iv.setAnimation(null);
}
}
Alles anzeigen
Hier ist die Methode LoadStartImages(breite, hoehe):
public void LoadStartImages(int breite, int hoehe)
{
URL url;
URLConnection connection;
HttpURLConnection httpConnection;
InputStream is = null;
int responseCode;
try {
if (startids[0] == 0) {
url = new URL("URL");
connection = url.openConnection();
httpConnection = (HttpURLConnection)connection;
responseCode = httpConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
is = httpConnection.getInputStream();
String ids = InputStreamToString(is);
JSONObject json_data = new JSONObject(ids);
startids[0] = json_data.getInt("ID1");
}
}
softreference = imagecache.get("starttip1");
if (softreference != null) {
bitmap = softreference.get();
if (bitmap != null) starttip1_view.setImageBitmap(bitmap);
Log.i(TAG, "Aus Cache");
}
else new ImageLoader(starttip1_view, new URL("URL?w="+breite+"&h="+hoehe+"&bname="+startids[0]+"_bild0.jpg")).execute();
}
catch(MalformedURLException mue) {}
catch(IOException ioe) {}
catch(JSONException jse) {}
}
Alles anzeigen
Aber irgendwie funktioniert das nicht, der Cache ist nach dem Drehen des Handys immer leer. Funktioniert das nur, wenn man das Handy nicht dreht, oder mache ich was falsch?
Ich würde mich über einen Tip oder Hilfe sehr freuen.