Autore Topic: il setAdapter() del mio viewpager blocca il thread della GUI principale  (Letto 390 volte)

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 116
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Come da oggetto, quando chiamo il metodo setAdapter()  del mio viewpager mi si blocca il thread della GUI principale, il setadapter credo non possa essere inserito in un asynctask.

Ho una ProgressBar che da quando setto l'adapter non gira più e questo effetto è al quanto sgradevole.

L'adapter è molto pesante perchè vengono settati i background a circa 100 imageview con una png di 100kb.
Ho notato che se cambio l'immagine png con una di 10kb l'adapter viene settato molto più velocemente.

Quindi la mia seconda domanda è: è possibile ridurre la risoluzione ( e quindi il peso in termini di kb) di un immagine programmaticamente tramite java?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:il setAdapter() del mio viewpager blocca il thread della GUI principale
« Risposta #1 il: 13 Luglio 2014, 15:23:19 CEST »
0
Devi semplicemente implementare un meccanismo di lazy load delle immagini.
Dai un occhio a Picasso:

Picasso

iClaude

  • Visitatore
Re:il setAdapter() del mio viewpager blocca il thread della GUI principale
« Risposta #2 il: 13 Luglio 2014, 19:44:24 CEST »
0
Quindi la mia seconda domanda è: è possibile ridurre la risoluzione ( e quindi il peso in termini di kb) di un immagine programmaticamente tramite java?

Certo, guarda questa guida (e le altre della stessa serie):
Loading Large Bitmaps Efficiently | Android Developers

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 116
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Re:il setAdapter() del mio viewpager blocca il thread della GUI principale
« Risposta #3 il: 13 Luglio 2014, 20:26:00 CEST »
0
Certo, guarda questa guida (e le altre della stessa serie):
Loading Large Bitmaps Efficiently | Android Developers


Ho provato ad utilizzare questo codice, ma non cambia il risultato, la velocità del setadapter è identica:

Codice (Java): [Seleziona]
mImageView.setImageBitmap(decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) {

                // First decode with inJustDecodeBounds=true to check dimensions
                final BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = true;
                BitmapFactory.decodeResource(res, resId, options);

                // Calculate inSampleSize
                options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

                // Decode bitmap with inSampleSize set
                options.inJustDecodeBounds = false;
                return BitmapFactory.decodeResource(res, resId, options);
        }

        public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
                // Raw height and width of image
                final int height = options.outHeight;
                final int width = options.outWidth;
                int inSampleSize = 1;

                if (height > reqHeight || width > reqWidth) {

                        final int halfHeight = height / 2;
                        final int halfWidth = width / 2;

                        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
                        // height and width larger than the requested height and width.
                        while ((halfHeight / inSampleSize) > reqHeight
                                        && (halfWidth / inSampleSize) > reqWidth) {
                                inSampleSize *= 2;
                        }
                }

                return inSampleSize;
        }

Post unito: 14 Luglio 2014, 10:30:59 CEST
Inoltre il problema principale è che durante il setadapter() vorrei che continuasse a girare la ProgressBar, invece questa rimane bloccata
« Ultima modifica: 14 Luglio 2014, 10:30:59 CEST da GennyAndroid, Reason: Merged DoublePost »

iClaude

  • Visitatore
Re:il setAdapter() del mio viewpager blocca il thread della GUI principale
« Risposta #4 il: 14 Luglio 2014, 10:49:01 CEST »
0
Nella serie di guide che ho linkato trovi un esempio completo relativo al ViewPager.
Prova a farlo uguale, COMPRESO il caricamento delle immagini in un thread separato.

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +153
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:il setAdapter() del mio viewpager blocca il thread della GUI principale
« Risposta #5 il: 14 Luglio 2014, 11:38:26 CEST »
0
Ho provato ad utilizzare questo codice, ma non cambia il risultato, la velocità del setadapter è identica:

Il tuo problema è che qualsiasi operazione stai facendo sulle immagini, le stai facendo nel Main Thread, quindi ti blocca la UI.

Come da oggetto, quando chiamo il metodo setAdapter()  del mio viewpager mi si blocca il thread della GUI principale, il setadapter credo non possa essere inserito in un asynctask.

Puoi inserire un AsyncTask all'interno del tuo adapter, in modo che le immagini siano caricate in async.

Devi semplicemente implementare un meccanismo di lazy load delle immagini.
Dai un occhio a Picasso:
Picasso

Questa è una delle soluzioni.
Picasso carica le immagini in modo asincrono, quindi risolverebbe il tuo problema.
Tradotto significa che nel tuo adapter devi sostituire il download delle immagini con qualcosa del tipo:

Codice (Java): [Seleziona]
Picasso.with(context)
  .load(url)
  .into(imageView)

Chiaramente Picasso non è l'unica library che fa questo. Personalmente la preferisco alla altre, ma ci sono anche Ion, UIL, Volley che risolvono tutte il tuo problema.