web-dev-qa-db-fra.com

Glide assert: Java.lang.IllegalArgumentException: Vous devez appeler cette méthode sur le thread principal.

Quelqu'un at-il utilisé Glide pour récupérer des images d’un fil d’arrière-plan? Je continue à recevoir cette affirmation:

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

mais selon ce fil, ça devrait marcher:

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

Cependant, je ne peux pas le faire fonctionner, à moins que je l'appelle du thread principal.

Voici ce que j'essaie de faire à partir du fil principal:

    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);
    }
}

et le 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);
    }
}

et mContext est simplement l'activité "ce" pointeur.

Quoi qu'il en soit, puis-je utiliser Glide à partir d'un thread différent de Main?

11
gmmo

La méthode into(ImageView) de Glide nécessite que vous l'appeliez uniquement sur le thread principal, mais lorsque vous transmettez le chargement à un minuteur, celui-ci sera exécuté dans un thread background.

Ce que vous pouvez faire est de récupérer une image bitmap en appelant get() au lieu de into(), puis définissez cette bitmap sur la ImageView en appelant setImageBitmap().

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

Vous pouvez également consulter ce document pour plus d'informations.

7
Avsector

Afficher le code au cas où cela aiderait quelqu'un.

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

Mettre à jour l'image dans le fil principal de l'interface utilisateur

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