ms-88: Android - Bilder / Thread

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

  1. Hallo,

    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).

    ich würde das skalieren der Bilder einem PHP Skript überlassen, da du so überflüssigen Traffic zum Handy verhinderst und der Server wahrscheinlich schneller Rechnet als mobile Geräte.

    1. Wie kann ich die Bilder alle korrekt hinbekommen, Nr. 35 passt ja zum Beispiel.

    Ich erkenne leider nicht so ganz was an der Darstellung nicht korrekt ist.

    1. 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?

    du kannst in beiden Threads eine "done" boolean variable setzten und dann von beiden aus den selben Handler aufrufen der am Anfang überprüft ob beide "done" auf true gesetzt sind.
    während der Verarbeitung bietet sich entweder eine Dialogbox(ohne Buttons) mit dem Text "Loading..." an oder du machst ein overlay mit einer working Animation.

    Viele Grüße,
    Tim

    1. Tach!

      ich würde das skalieren der Bilder einem PHP Skript überlassen, da du so überflüssigen Traffic zum Handy verhinderst und der Server wahrscheinlich schneller Rechnet als mobile Geräte.

      Skalieren auf welche Größe bitteschön? Es gibt Android-Geräte mit allen möglichen Screen-Größen und DPI-Werten, wobei diese Gegebenheiten sich nicht proportional verhalten. Da hat man dann auch kleine Bildschirme (5") mit recht hohen DPI-Werten, wie sie üblicherweise auf Desktop-Bildschirmen (17") zu finden sind. Man müsste also dem Server die Gerätegegebenheiten mitteilen, damit die Bilder nicht unbrauchbar werden. Also müsste jedes Bild bei Abruf erst berechnet werden oder die DPI-Werte werden in Gruppen aufgeteilt, und für jede Gruppe wird ein Bild vorgehalten, so wie das bei Android gängig ist. - Und sooo langsam sind die mobilen Geräte heutzutage auch nicht mehr.

      dedlfix.

      1. Skalieren auf welche Größe bitteschön?

        Auf "Web-Größe" (also meinetwegen irgendwas um die 500 x 500 Pixel / 50 KB maximal). Auf den Screenshots sieht man ja, dass es sich offensichtlich nur um ein kleines Vorschaubild handelt, da reicht sicherlich was noch kleineres. Das muss nicht in 3000 x 2000 Pixel und Druckqualität vorliegen - auch wenn die so evtl. auf dem Server liegen. Der OP schrieb ja:

        Das Problem ist es gibt hierzu jetzt jede Menge Bilder die leider auch relativ groß sein könnnen

        Über meine GPRS/EDGE/3G/UMTS-Leitung würde ich sowas nicht unbedingt laden wollen... Vor allem, wenn es gleich 10 oder 20 Bilder sind... womöglich mit je 5 MB... Auch wenn mein Android-Gerät mit den Bildern ansonsten sicherlich kein Problem hätte...