Autore Topic: Come velocizzare il caricamento di una lista ??  (Letto 2783 volte)

Offline bakiko

  • Utente junior
  • **
  • Post: 74
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One
  • Sistema operativo:
    Windows 7
Come velocizzare il caricamento di una lista ??
« il: 25 Febbraio 2013, 16:18:12 CET »
0
Salve ragazzi ho un piccolo problema con il caricamento di una lista.In particolare vorrei rendere più veloce lo scrolling della mia lista,che attraverso il parsing viene riempito dinamicamente.Qui di sotto vi riporto il codice scritto:

Codice (Java): [Seleziona]
public class ActivityNotizia extends ListActivity {
 
 private ArrayAdapter<Notizia> arrayAdapterNotizia;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  try {
   arrayAdapterNotizia = this.getArrayAdapterNotizia();
   this.setListAdapter(arrayAdapterNotizia);
  }  catch (IOException e) {
   e.printStackTrace();
  }
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.activity_notizia, menu);
  return true;
 }

 private ArrayAdapter<Notizia> getArrayAdapterNotizia() throws IOException{
  ArrayList<Notizia> oggettoNotizia = new Parsing().parserElencoNotizia();
  return new CustomArrayAdapterNotizia<Notizia>(this,R.layout.row,oggettoNotizia);
 
 }
 @Override
 protected void onListItemClick(ListView l, View v, int position, long id) {
  super.onListItemClick(l, v, position, id);
  String selezionato=arrayAdapterNotizia.getItem(position).getHref();
  Intent intent = new Intent(this,ActivityArticolo.class);
  Bundle bundle = new Bundle();
  bundle.putString("href", selezionato);
  intent.putExtras(bundle);
  this.startActivity(intent);
 }

La presente activity funziona, solo che lo scrolling della lista non è fluido.
Ringrazio a tutti per la collaborazione..... ;)

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
R: Come velocizzare il caricamento di una lista ??
« Risposta #1 il: 25 Febbraio 2013, 16:23:14 CET »
0
Una lista poco fluida è quasi sempre un problema dell'adapter, nel getView ricicli la vista che ti passa?
Ps: scusa se non sono più preciso ma rispondo dal cellulare...

Offline bakiko

  • Utente junior
  • **
  • Post: 74
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One
  • Sistema operativo:
    Windows 7
Re:R: Come velocizzare il caricamento di una lista ??
« Risposta #2 il: 25 Febbraio 2013, 16:30:57 CET »
0
Una lista poco fluida è quasi sempre un problema dell'adapter, nel getView ricicli la vista che ti passa?
Ps: scusa se non sono più preciso ma rispondo dal cellulare...
tranquillo non preoccuparti, anzi grazie mille per aver prontamente risposto...
Ti allego l'arrayAdapter creato dove viene implementato il metodo da te citato.

Grazie per la collaborazione... ;)

Codice (Java): [Seleziona]
public class CustomArrayAdapterNotizia<T> extends ArrayAdapter<Notizia>{

 private ArrayList<Notizia> arrayNotizia;
 private LayoutInflater layoutInflater;
 
 public CustomArrayAdapterNotizia(Context context, int textViewResourceId,List<Notizia> objects) {
  super(context, textViewResourceId, objects);
  arrayNotizia = (ArrayList<Notizia>) objects;
  layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  View view = convertView;
  if (convertView == null)
  view = layoutInflater.inflate(R.layout.activity_notizia, null);
  TextView titolo = (TextView) view.findViewById(R.id.titoloNotizia);
  TextView data = (TextView) view.findViewById(R.id.data);
  ImageView immagine = (ImageView) view.findViewById(R.id.immagineNotizia);
  Notizia notizia = arrayNotizia.get(position);
  Bitmap bimage = getBitMapFromUrl(notizia.getPhoto());
  immagine.setImageBitmap(bimage);
  titolo.setText(notizia.getTitolo());
  data.setText(notizia.getData());
  return view;
 }

 private Bitmap getBitMapFromUrl(String uri){
  try{
  Log.e("src", uri);
  URL url=new URL(uri);
  HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  connection.setDoInput(true);
  connection.connect();
  InputStream input = connection.getInputStream();
  Bitmap bitmap = BitmapFactory.decodeStream(input);
  Log.e("Bitmap", "returned");
  return bitmap;
  } catch (IOException e) {
   e.printStackTrace();
   Log.e("Exception", e.getMessage());
   return null;
  }
 }
}

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:Come velocizzare il caricamento di una lista ??
« Risposta #3 il: 25 Febbraio 2013, 17:00:43 CET »
0
Se, come mi sembra di capire, fai il fetch della bitmap dalla rete direttamente nella getView, sono stupito che non ti crashi.

Il modo corretto sarebbe fare un lazy load delle immagini.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline bakiko

  • Utente junior
  • **
  • Post: 74
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One
  • Sistema operativo:
    Windows 7
Re:Come velocizzare il caricamento di una lista ??
« Risposta #4 il: 25 Febbraio 2013, 17:08:36 CET »
0
Se, come mi sembra di capire, fai il fetch della bitmap dalla rete direttamente nella getView, sono stupito che non ti crashi.

Il modo corretto sarebbe fare un lazy load delle immagini.

No l'applicazione gira (senza crash).Mi potresti dire come fare un lazy load delle immagini, ti ringrazio ;)..

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Come velocizzare il caricamento di una lista ??
« Risposta #5 il: 25 Febbraio 2013, 17:41:46 CET »
0

Offline bakiko

  • Utente junior
  • **
  • Post: 74
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One
  • Sistema operativo:
    Windows 7
Re:Come velocizzare il caricamento di una lista ??
« Risposta #6 il: 25 Febbraio 2013, 18:54:35 CET »
0
Dai un occhio a queste lezioni:

Displaying Bitmaps Efficiently | Android Developers
Grazie Ricky al più presto gli darò un' occhiata...Quindi credo di aver capito che il problema con la fluidità della mia lista è dovuta al non corretto caricamento delle immagini..

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Come velocizzare il caricamento di una lista ??
« Risposta #7 il: 25 Febbraio 2013, 19:14:12 CET »
0
Grazie Ricky al più presto gli darò un' occhiata...Quindi credo di aver capito che il problema con la fluidità della mia lista è dovuta al non corretto caricamento delle immagini..

Si la la fluidità dello scrolling è compromessa perchè tu blocchi il thread della UI caricando le immagini.
La best practice è quella di caricare le immagini in un thread separato e utilizzare un sistema di cache a due livelli (memoria e disco).

Tra le librerie che potresti usare c'è questa che è ottima:
https://github.com/novoda/ImageLoader


Offline bakiko

  • Utente junior
  • **
  • Post: 74
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One
  • Sistema operativo:
    Windows 7
Re:Come velocizzare il caricamento di una lista ??
« Risposta #8 il: 26 Febbraio 2013, 16:24:40 CET »
0
Finalmente grazie a voi sto capendo qualche cosa.Praticamente io intasavo tutto :D
Comunque la libreria che mi hai fatto notare è davvero ottima.Hai anche qualche esempio per capire un pò come utilizzarla.
Scusami se ti disturbo ancora...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Come velocizzare il caricamento di una lista ??
« Risposta #9 il: 26 Febbraio 2013, 16:51:48 CET »
0
Ti consiglio ti studiarti questo sample:

https://github.com/novoda/ImageLoader/blob/master/demo/src/com/novoda/imageloader/demo/activity/ImageLongList.java

Questo è il "succo" del caricamento:

Codice (Java): [Seleziona]
  @Override
    protected ViewBinder getViewBinder() {
        return new ViewBinder() {
            @Override
            public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
                String url = cursor.getString(columnIndex);
                setImageTag((ImageView) view, url);
                loadImage((ImageView) view);
                return true;
            }

        };
    }

Tu dovresti metterlo nel metodo getView del tuo ArrayAdapter e fare gli opportuni adattamenti :)

Offline bakiko

  • Utente junior
  • **
  • Post: 74
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One
  • Sistema operativo:
    Windows 7
Re:Come velocizzare il caricamento di una lista ??
« Risposta #10 il: 05 Marzo 2013, 12:15:44 CET »
0
Ciao Ricky, in questi giorni ho cercato di modificare un pò il codice integrandolo con la classe da te consigliata.Non volevo disturbarti ma mi sa che sono costretto a farlo.
Praticamente l'app viene lanciata senza visualizzare nessun tipo di arrayAdapter, dopodichè crasha.Ti ringrazio per l'aiuto che mi stai dando.
Questo è la porzione di codice che ho cercato di modificare:
Codice (Java): [Seleziona]
public View getView(int position, View convertView, ViewGroup parent) {
                View view = convertView;
                if (convertView == null)
                view = layoutInflater.inflate(R.layout.activity_notizia, null);
                TextView titolo = (TextView) view.findViewById(R.id.titoloNotizia);
                TextView data = (TextView) view.findViewById(R.id.data);
                ImageView immagine = (ImageView) view.findViewById(R.id.immagineNotizia);
                Notizia notizia = arrayNotizia.get(position);
                ImageLoader imageLoader=ImageLoader.getIstance();
                String url=this.getItem(position).getPhoto();
                immagine.setTag(url);
                imageLoader.displayImage(url, immagine);
                DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageForEmptyUri(R.drawable.ic_launcher)
                .cacheOnDisc()
                .resetViewBeforeLoading()
                .showStubImage(R.drawable.ic_launcher).build();
                titolo.setText(notizia.getTitolo());
                data.setText(notizia.getData());
                return view;
        }

Mentre questo è il logcat:
Codice (Java): [Seleziona]
03-05 11:14:08.734: D/AndroidRuntime(284): Shutting down VM
03-05 11:14:08.734: W/dalvikvm(284): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
03-05 11:14:08.768: E/AndroidRuntime(284): FATAL EXCEPTION: main
03-05 11:14:08.768: E/AndroidRuntime(284): java.lang.NoClassDefFoundError: com.nostra13.universalimageloader.core.ImageLoader
03-05 11:14:08.768: E/AndroidRuntime(284):      at com.example.beneventofree.it.CustomArrayAdapterNotizia.<init>(CustomArrayAdapterNotizia.java:31)
03-05 11:14:08.768: E/AndroidRuntime(284):      at com.example.beneventofree.it.ActivityNotizia.getArrayAdapterNotizia(ActivityNotizia.java:43)
03-05 11:14:08.768: E/AndroidRuntime(284):      at com.example.beneventofree.it.ActivityNotizia.onCreate(ActivityNotizia.java:27)
03-05 11:14:08.768: E/AndroidRuntime(284):      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-05 11:14:08.768: E/AndroidRuntime(284):      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
03-05 11:14:08.768: E/AndroidRuntime(284):      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-05 11:14:08.768: E/AndroidRuntime(284):      at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-05 11:14:08.768: E/AndroidRuntime(284):      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-05 11:14:08.768: E/AndroidRuntime(284):      at android.os.Handler.dispatchMessage(Handler.java:99)
03-05 11:14:08.768: E/AndroidRuntime(284):      at android.os.Looper.loop(Looper.java:123)
03-05 11:14:08.768: E/AndroidRuntime(284):      at android.app.ActivityThread.main(ActivityThread.java:4627)
03-05 11:14:08.768: E/AndroidRuntime(284):      at java.lang.reflect.Method.invokeNative(Native Method)
03-05 11:14:08.768: E/AndroidRuntime(284):      at java.lang.reflect.Method.invoke(Method.java:521)
03-05 11:14:08.768: E/AndroidRuntime(284):      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-05 11:14:08.768: E/AndroidRuntime(284):      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-05 11:14:08.768: E/AndroidRuntime(284):      at dalvik.system.NativeStart.main(Native Method)

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:Come velocizzare il caricamento di una lista ??
« Risposta #11 il: 05 Marzo 2013, 12:33:56 CET »
0
NoClassDefError, hai importato la libreria (messa nella cartella lib)?
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 bakiko

  • Utente junior
  • **
  • Post: 74
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One
  • Sistema operativo:
    Windows 7
Re:Come velocizzare il caricamento di una lista ??
« Risposta #12 il: 05 Marzo 2013, 13:12:06 CET »
0
Si Nicola l'ho messa nella cartella lib, ed inoltre l'ho importata manualmente con eclipse

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Come velocizzare il caricamento di una lista ??
« Risposta #13 il: 05 Marzo 2013, 13:15:17 CET »
0
Si Nicola l'ho messa nella cartella lib, ed inoltre l'ho importata manualmente con eclipse

La cartella è "libs", non "lib" :-)
Se l'hai messa li dentro non serve che la aggiungi nel build path tramite eclipse ;)

Comunque, la variabile imageLoader ti conviene inizializzarla nel costruttore dell'adapter piuttosto che nel metodo getView e se riesci implementa anche il riuso della convertview, che ti migliora ulteriormente lo scrolling.
« Ultima modifica: 05 Marzo 2013, 13:17:35 CET da Ricky` »

Offline bakiko

  • Utente junior
  • **
  • Post: 74
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One
  • Sistema operativo:
    Windows 7
Re:Come velocizzare il caricamento di una lista ??
« Risposta #14 il: 05 Marzo 2013, 13:33:34 CET »
0
Si scusami Ricky la cartella è libs (non lib come erroneamente ho detto prima).Ora provvederò a cancellarla dal build path.
La variabile imageLoader l'avevo inizializzata nel costruttore dell'adapter solo che a furia di modificare il codice mi sono dimenticato di metterlo al suo posto (grazie del consiglio ;) )...
Riguardo alla convertview adesso proverò ad implementarlo. Ma Ricky è normale che l' app mi crashi senza visualizzarmi l'adapter?