Autore Topic: Immagini scaricate dalla rete in cache  (Letto 546 volte)

Offline Dav_android

  • Utente junior
  • **
  • Post: 78
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab2 10.1
  • Sistema operativo:
    Windows 8
Immagini scaricate dalla rete in cache
« il: 17 Gennaio 2015, 12:38:51 CET »
0
Ciao ragazzi, ho una ListView di oggetti che contengono anche un immagine scaricata dalla rete ho creato un custom adapter che lancia un task asincrono per ogni immagine che deve essere scaricata allo scroll, ovviamente questo avviene anche quando scrollo portando la lista verso l'alto in quanto avviene di nuovo il download. Le prestazioni dell'app sono comunque soddisfacenti però vorrei evitare di rifare il download, ho letto la seguente guida:
http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

però non saprei come applicarla al custom adapter che ho creato.

Mi dareste qualche consiglio?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Immagini scaricate dalla rete in cache
« Risposta #1 il: 17 Gennaio 2015, 13:29:00 CET »
0
Posta il tuo adapter.

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Immagini scaricate dalla rete in cache
« Risposta #2 il: 17 Gennaio 2015, 18:32:03 CET »
0
La risposta è usa una di queste librerie.

- Picasso (preferita da me)
- UIL
- Volley
- Ion

Offline Dav_android

  • Utente junior
  • **
  • Post: 78
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab2 10.1
  • Sistema operativo:
    Windows 8
Re:Immagini scaricate dalla rete in cache
« Risposta #3 il: 19 Gennaio 2015, 22:03:29 CET »
0
Il mio adapter è il seguente:

Codice (Java): [Seleziona]
public class NewsAdapter extends ArrayAdapter<News> {

    public NewsAdapter(Context context, int resource, List<News> objects) {
        super(context, resource, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder viewHolder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.row_news, null);
            viewHolder = new ViewHolder();
            viewHolder.position = position;
            viewHolder.idNews = (TextView) convertView.findViewById(R.id.idNews);
            viewHolder.titoloNews = (TextView) convertView.findViewById(R.id.titoloNews);
            viewHolder.dataNews = (TextView) convertView.findViewById(R.id.dataNews);
            viewHolder.immagineNews = (TextView) convertView.findViewById(R.id.immagineNews);
            viewHolder.imageNews = (ImageView) convertView.findViewById(R.id.imageNews);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        News news = getItem(position);
        viewHolder.position = position;
        viewHolder.idNews.setText(news.getId());
        viewHolder.titoloNews.setText(news.getTitolo());
        viewHolder.dataNews.setText(news.getData());
        viewHolder.immagineNews.setText(news.getImmagine());

        if(news.getImmagine() != "null"){
            new DownloadImageTask(news.getId(),position,viewHolder).execute(news.getImmagine());
        }

        return convertView;

    }

    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {

        private String id;
        private int position;
        private ViewHolder viewHolder;

        public DownloadImageTask(String id, int position, ViewHolder viewHolder) {
            this.id = id;
            this.position = position;
            this.viewHolder = viewHolder;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            viewHolder.imageNews.setImageResource(R.drawable.ic_launcher);
        }

        protected Bitmap doInBackground(String... urls) {
            return loadImageFromNetwork(urls[0]);
        }

        private Bitmap loadImageFromNetwork(String url) {
            Bitmap bm = null;
            InputStream is = null;

            try {
                HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
                conn.connect();
                is = conn.getInputStream();

                BitmapFactory.Options options = new BitmapFactory.Options();
               
                bm = BitmapFactory.decodeStream(is, null, options);

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            Log.i("DOWNLOAD", "ESECUZIONE "+id);
            return bm;
        }

        protected void onPostExecute(Bitmap result) {
            if (viewHolder.position == position && result != null) {
                viewHolder.imageNews.setImageBitmap(result);
            }
        }
    }

    private class ViewHolder {
        public int position;
        public TextView idNews;
        public TextView titoloNews;
        public TextView dataNews;
        public TextView immagineNews;
        public ImageView imageNews;
    }

}

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Immagini scaricate dalla rete in cache
« Risposta #4 il: 19 Gennaio 2015, 23:23:38 CET »
0
Ti è stato suggerito da uno dei più esperti del forum di usare una di 2 librerie proposte. Se è stato scritto cosi ci sarà un motivo. Sono librerie sempre aggiornate e molto supportate e con 3 righe di codice fai quello che vuoi fare in 30 delle tue minimo

Offline Dav_android

  • Utente junior
  • **
  • Post: 78
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab2 10.1
  • Sistema operativo:
    Windows 8
Re:Immagini scaricate dalla rete in cache
« Risposta #5 il: 20 Gennaio 2015, 17:41:41 CET »
0
Lo so, ma il fatto è che vorrei imparare a farlo io.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Immagini scaricate dalla rete in cache
« Risposta #6 il: 20 Gennaio 2015, 18:35:44 CET »
0
Lo so, ma il fatto è che vorrei imparare a farlo io.

Come ti avevo accennato in altre due occasioni, se tutti (ma proprio tutti) usano queste librerie c'è un motivo più che valido. Sostanzialmente è perchè dietro a due parole come "image cache" c'è una complessità che non si esaurisce in tre righe di codice.

Prova ad aprire il sorgente di Picasso, e vedrai che non è una cosa che si può spiegare nelle 5 righe di una risposta in un forum (anche perchè personalmente non sarei in grado).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Immagini scaricate dalla rete in cache
« Risposta #7 il: 21 Gennaio 2015, 07:38:09 CET »
0
Lo so, ma il fatto è che vorrei imparare a farlo io.

Questa cosa è apprezzabile, ma non sempre il gioco vale la candela.
Come ti è già stato detto, realizzare una cache non è banalissimo, ci sono tante variabili di cui tenere conto (in memoria, su disco, quando grande...., quando la svuoto...).

Prendiamo Picasso.
Guarda il numero delle classi che compongono la libreria.
Questa libreria gestisce "solo" le immagini con le loro varie problematiche.

Ora se Picasso l'avesse scritta Google, tu l'avresti usata, così come usi le altre parti.(ps. Volley è proprio di Google).
Tra le altre cose il team di Picasso , non solo mantiene la libreria in modo impeccabile da anni, ma la usa, ed è senza dubbio uno dei team di sviluppo più quotati nel mondo. Parliamo di codice di alta qualità ed efficienza.

Imparare a fare le cose, non sempre significa scriverle da zero.
Spesso significa trovare il modo migliore di farlo, usando le cose che sono disponibili al momento.




Offline Dav_android

  • Utente junior
  • **
  • Post: 78
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab2 10.1
  • Sistema operativo:
    Windows 8
Re:Immagini scaricate dalla rete in cache
« Risposta #8 il: 21 Gennaio 2015, 08:28:26 CET »
0
Ok grazie dei consigli, allora gli darò un'occhiata. Come dicevo ho già raggiunto un buon risultato con la listview il problema era semplicemente che ritornando verso l'alto anche per le immagini precedenti si avvia il task che le riscarica. Il problema in effetti è da poco in quanto è comunque veloce, però volevo solo evitare questa cosa. La memoria occupata dall'app allo scroll è di circa 7-8mb, pensate sia accettabile?