2016-02-26 10 views
6

chiunque usi la glide per recuperare le immagini da un thread in background? Continuo a ricevere questa asserzione:Asserzione glide: java.lang.IllegalArgumentException: è necessario chiamare questo metodo sul thread principale

java.lang.IllegalArgumentException: You must call this method on the main thread 

ma secondo questa discussione, dovrebbe funzionare (credo):

https://github.com/bumptech/glide/issues/310

ancora, non riesco a farlo funzionare, a meno che io chiamo da il thread principale.

Ecco è quello che sto cercando di fare dal thread principale:

Glide.get(mContext); 
    loadUserImage(userImageUrl); 

    // wait 5 seconds before trying again 
    int imageLoadingTimeOut = mContext.getResources().getInteger(R.integer.image_loading_time_out); 
    if (imageLoadingTimeOut > 0) { 
     new Timer().schedule(new TimerTask() { 
      @Override 
      public void run() { 
       if (!mUserImageLoaded) { 
        loadUserImage(userImageUrl); 
       } 
      } 
     }, imageLoadingTimeOut); 
    } 
} 

e la loadUserImage:

private boolean mUserImageLoaded = false; 

private void loadUserImage(String userImageUrl) { 

    if (userImageUrl != null && !userImageUrl.isEmpty() && !mUserImageLoaded) { 
     Glide.with(mContext).using(Cloudinary.getUrlLoader(mContext)).load(userImageUrl).crossFade().listener(new RequestListener<String, GlideDrawable>() { 

      @Override 
      public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 
       return false; 
      } 

      @Override 
      public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
       mImageMessageContent.invalidate(); 
       mUserImageLoaded = true; 
       return false; 
      } 
     }).into(mImageMessageContent); 

    } else { 
     mImageMessageContent.setVisibility(View.GONE); 
    } 
} 

e mContext è solo l'attività di "questo" puntatore.

In ogni caso, posso utilizzare Glide da una filettatura diversa da quella principale?

thx!

+0

non chiamare il metodo di carico in thread separato o fare quella corsa filo onUi filo –

+0

può elaborare più? Come posso renderlo non eseguito su un thread onUI? Devo passare il puntatore ImageView per planare. Questo puntatore viene estratto dal thread dell'interfaccia utente principale. – gmmo

risposta

7

Il metodo into(ImageView) di Glide richiede di chiamarlo solo sul thread principale, ma quando si passa il caricamento a un timer verrà eseguito in un thread background.

Che cosa si può fare è quello di recuperare un bitmap chiamando get() invece di into() e quindi impostare che bitmap sul ImageView chiamando setImageBitmap().

Glide.with(getApplicationContext()) 
    .load("your url") 
    .asBitmap() 
    .into(new BitmapImageViewTarget(imgView) { 
     @Override 
     protected void setResource(Bitmap resource) { 
     //Play with bitmap 
     super.setResource(resource); 
     } 
    }); 

Si può anche dare un'occhiata a questo document per ulteriori informazioni.

2

Inserendo il codice nel caso in cui aiuti qualcuno.

Bitmap myBitmap = Glide.with(applicationContext) 
     .load(yourUrl) 
     .asBitmap() 
     .centerCrop() 
     .into(Target.SIZE_ORIGINAL,Target.SIZE_ORIGINAL) 
     .get() 
imageView.setImageBitmap(myBitmap); 
0

immagine Aggiornamento in thread dell'interfaccia utente principale

runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Glide.with(MainActivity.this) 
            .load("image URL") 
            .into(imageView); 
         } 
        }); 
Problemi correlati