Autore Topic: Immagini "corrotte" durante il download  (Letto 572 volte)

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 316
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Immagini "corrotte" durante il download
« il: 16 Febbraio 2016, 10:08:03 CET »
0
Salve a tutti!

La mia applicazione scarica delle immagini tramite un'url, le salva nella cache della sd e poi le mostra all'utente, però in casi particolari (tipoo una connessione non ottimale) può capitare che tali immagini vengano corrotte (si vede solo una porzione della foto oppure da un'immagine bianca) e le salva nella cache, successivamente l'app non riscarica l'immagine perché nella cache è già presente il file anche se corrotto.

La soluzione più drastica sarebbe cancellare la cache quando l'app viene chiusa ma non vorrei obbligare l'utente a riscaricare le immagini ogni volta (anche se sono grandi al massimo 500 kb).

Oppure (nel limite del possibile) vedere se l'immagine è corrotta e nel caso riscaricarla.

Avete qualche suggerimento su come risolvere questo piccolo bug?

Grazie mille a tutti!

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Immagini "corrotte" durante il download
« Risposta #1 il: 16 Febbraio 2016, 10:42:23 CET »
+1
Sul server metti  due files, una è l'immagine e l'altro è il checksum MD5.
Li scarichi entrambi e poi verifichi che il checksum dell'immagine corrisponda.  ;-)

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 316
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Immagini "corrotte" durante il download
« Risposta #2 il: 16 Febbraio 2016, 10:52:02 CET »
0
Mmmmm capito.... nel caso io lanciassi più download contemporaneamente? ad esempio una lista con immagini di preview, dovrei usare dei thread per associare il file al suo checksum?

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Immagini "corrotte" durante il download
« Risposta #3 il: 16 Febbraio 2016, 11:13:54 CET »
0
Mmmmm capito.... nel caso io lanciassi più download contemporaneamente? ad esempio una lista con immagini di preview, dovrei usare dei thread per associare il file al suo checksum?
Si direi che per ogni thread scarichi la coppia di file e poi dopo lo scarico fai la verifica

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 316
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Immagini \"corrotte\" durante il download
« Risposta #4 il: 16 Febbraio 2016, 11:17:57 CET »
0
Oooook, grazie mille!
Ora provo !

Post unito: 16 Febbraio 2016, 11:26:01 CET
Provando a fare il checksum md5 all'interno dell'app ho riscontrato un problema non piccolo... ogni volta il checksum del file è diverso!

questo è il codice che uso per fare il download ed il checksum:
Codice (Java): [Seleziona]
 URL URL = new URL(url);
            URLConnection connection = URL.openConnection();
            InputStream is = connection.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            FileOutputStream fos = new FileOutputStream(f);
            byte buffer[] = new byte[1024];
            int read;
            while ((read = bis.read(buffer)) > 0) {
                fos.write(buffer, 0, read);
            }

            String encTarget = new String(buffer);

            MessageDigest mdEnc = null;
            try {
                mdEnc = MessageDigest.getInstance("MD5");
            } catch (NoSuchAlgorithmException e) {
                System.out.println("Exception while encrypting to md5");
                e.printStackTrace();
            } // Encryption algorithm
            mdEnc.update(encTarget.getBytes(), 0, encTarget.length());
            String md5 = new BigInteger(1, mdEnc.digest()).toString(16);
            while ( md5.length() < 32 ) {
                md5 = "0"+md5;
            }

            Log.e("MD5", "MD5:" + md5.toString());
            Log.e("File", "Route:" + f.getAbsolutePath().toString());

            if(md5.toString().equals("280df35e17b28d61cc7643e3e00027d5")){
                Log.e("MD5", "HAHAHAHAHA");
            }

è corretto che non sia mai uguale?

questo è un' MD5 di esempio: MD5:88e64765bb6b20750b4d84a6a9c8db6a
mentre qui è dove salvo il file: Route:/data/data/com.example.testapp/cache/317716730

è possibile che ci sia qualcosa nella cache (o nella ruoute) che mi fa cambiare sempre il checksum?
« Ultima modifica: 16 Febbraio 2016, 11:26:01 CET da ValerioAdo, Reason: Merged DoublePost »

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 316
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Immagini "corrotte" durante il download
« Risposta #5 il: 22 Febbraio 2016, 09:04:20 CET »
0
Nel caso non ci sarebbe un metodo "base" per risolvere il problema? tipo un download migliore ecc..

Perché questo problema me lo da solo sui tablet o device che hanno già qualche anno. La "potenza" del device e la linea internet possono incidere su questa cosa?

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Immagini "corrotte" durante il download
« Risposta #6 il: 22 Febbraio 2016, 11:20:48 CET »
0
ma scusa, perchè non usi glide o picasso per le immagini? fanno già tutto loro...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 316
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Immagini \"corrotte\" durante il download
« Risposta #7 il: 22 Febbraio 2016, 15:19:21 CET »
0
ok, li guardo e poi faccio sapere.
Grazie mille!

Post unito: 22 Febbraio 2016, 15:51:36 CET
Ok,sto provando Picasso e per quanto riguarda la foto singola sembra andare da dio... invece nelle liste (perché ho una lista di item con le immagini di preview) mi rallenta veramente tantissimo lo scorrimento della lista... è normale o devo settare qualche parametro in maniera particolare?
« Ultima modifica: 22 Febbraio 2016, 15:51:36 CET da ValerioAdo, Reason: Merged DoublePost »

Offline spectrumIg

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:Immagini "corrotte" durante il download
« Risposta #8 il: 22 Febbraio 2016, 16:51:17 CET »
0
Ok,sto provando Picasso e per quanto riguarda la foto singola sembra andare da dio... invece nelle liste (perché ho una lista di item con le immagini di preview) mi rallenta veramente tantissimo lo scorrimento della lista... è normale o devo settare qualche parametro in maniera particolare?

Usi un Adapter per la lista, giusto? Puoi postare il codice della getView/onBindViewHolder? Picasso lo usato parecchio al lavoro e ho notato che certe volte nelle liste, soprattutto quelle in cui gli elementi variano drasticamente con la posizione, ha qualche piccolo problema ma nulla di irrisolvibile.
Se puoi, prova anche Glide. Hanno praticamente la stessa sintassi quindi in realta' è anche molto semplice switchare da una all'altra. A mio avviso per queste cose e' un pelino piu' performante.

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 316
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Immagini "corrotte" durante il download
« Risposta #9 il: 22 Febbraio 2016, 18:03:30 CET »
0
Certo!

Anche se a dir la verità ho quasi risolto:
Codice (Java): [Seleziona]
   View vi=convertView;
        ViewHolder holder;

        if(convertView==null){

            /****** Inflate tabitem.xml file for each row ( Defined below ) *******/
            vi = inflater.inflate(R.layout.panoramirow, null);

            /****** View Holder Object to contain tabitem.xml file elements ******/

            holder = new ViewHolder();
            holder.text = (TextView) vi.findViewById(R.id.nome);
            holder.text1=(TextView)vi.findViewById(R.id.Distanza);
            holder.text2=(TextView)vi.findViewById(R.id.DriveDist);
            holder.text3=(TextView)vi.findViewById(R.id.WalkDist);
            holder.image=(ImageView)vi.findViewById(R.id.preview);
            holder.sponsor=(ImageView) vi.findViewById(R.id.Star);

            /************  Set holder with LayoutInflater ************/
            vi.setTag( holder );
        }
        else
            holder=(ViewHolder)vi.getTag();


        holder.text.setText(name[position]);
        holder.text1.setText(dist[position]);
        holder.text2.setText(drive[position]);
        holder.text3.setText(walk[position]);
        ImageView image = holder.image;

        Typeface tf2= Typeface.createFromAsset(mcontext.getAssets(), "DancingRegular.ttf");

        holder.text.setTypeface(tf2);

        if(name[position].length()>25){
            holder.text.setTextSize(18F);
        }

        if(Valori.Fourp==1) {
            holder.text.setTextSize(22F);
            holder.text1.setTextSize(11F);
            holder.text2.setTextSize(11F);
            holder.text3.setTextSize(11F);

            holder.text1.setWidth(30);
            holder.text2.setWidth(30);
            holder.text3.setWidth(30);
        }

        if(Valori.Fourp==2){
            holder.text.setTextSize(35F);
            holder.text1.setTextSize(22F);
            holder.text2.setTextSize(22F);
            holder.text3.setTextSize(22F);
        }

        //DisplayImage function from ImageLoader Class
        if(!data[position].equals("")) {
            //imageLoader.DisplayImage(data[position], image);
            Picasso.with(mcontext).load(data[position]).resize(150, 150).into(image);
        }

        /******** Set Item Click Listner for LayoutInflater for each row ***********/
       // vi.setOnClickListener(new OnItemClickListener(position));
        return vi;

Ho dovuto fare un resize delle immagini perché avere 10/15 righe ed ognuna con un'immagine che si avvicina ai 500 kb il device faceva un poco di fatica.

Se hai altri consigli va benissimo ^^