Hallo,
Ich schreib zum Einarbeiten eine kleine App.
Dazu gibt es eine Seite im Internet die Angebote von Supermärkten auflistet inklusive Bilder, Preis, etc.
Die Schritte derzeit sind Shop -> Shopname -> Angebote zum Shop in einer Listactivity anzeigen.
Dazu verbind ich zu einem PHP Script am Server welches mir zum Shop die Produkte in einem JSON String ausgibt (MYSQL Abfrage). Diesen lese ich dann wiederum in Java ein und setze die Daten in meinem Adapter.
Das Problem ist es gibt hierzu jetzt jede Menge Bilder die leider auch relativ groß sein könnnen. Dazu hab ich im Internet etwas gefunden - es läuft so ab dass das Bild geladen wird in einen Inputstream - anschließend in einen tmpOrder am Handy also ein File als Outputstream kopiert wird. Danach wird es Skaliert und gesetzt. Diese Methode Buffered also das Bild in dem Ordner (im Moment noch unnötig aber später vielleicht nett wenn nicht alles neu geladen werden muss).
Leider ist die Darstellung teilweise kaputt beim Skalieren - ich frag mich ob es an der größe/verarbeitung oder ähnlichem liegt.
Screenshot:
Der Code beim Skalieren:
try {
Bitmap bitmap = null;
String URL_PATH = ("http://www.meineaktionen.at/products/" + data[2]).replace(" ", "%20");
File cacheDir = new File(android.os.Environment.getExternalStorageDirectory(), "meineaktionen_cache");
if (!cacheDir.exists()) {
cacheDir.mkdirs();
}
File f = new File(cacheDir, String.valueOf(URL_PATH.hashCode()));
URL imageUrl = new URL(URL_PATH);
HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is = conn.getInputStream();
OutputStream os = new FileOutputStream(f);
byte[] buffer = new byte[1024];
// copy stream
while (true) {
int count = is.read(buffer, 0, 1024);
if (count == -1) break;
os.write(buffer, 0, 1024);
}
os.close();
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
// sets o.outWidth and o.outHeight
BitmapFactory.decodeStream(new FileInputStream(f), null, o);
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale=1;
while(true){
if(width_tmp / 2 < 50 || height_tmp / 2 < 50) break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
Log.i("SCALE", String.valueOf(scale));
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
bitmap = BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
ImageView image = (ImageView) v.findViewById(R.id.image);
image.setImageBitmap(bitmap);
f.delete();
1. Wie kann ich die Bilder alle korrekt hinbekommen, Nr. 35 passt ja zum Beispiel.
2. Ich möchte das verarbeiten der Bilder in 1-2 Threads aufteilen (im Servcie) die mir dann eine Hashmap<String, Bitmap> zurückliefern. - wie kombinier ich das am besten wenn beide fertig sind bzw. was zeig ich während des Verarbeitens der Bilder im Mainthread/Activitiy an?
lg