Glide assert: java.lang.IllegalArgumentException: вы должны вызвать этот метод в основном потоке

Кто-нибудь использовал java . lang . IllegalArgumentException : вы должны вызвать этот метод в основном потоке для извлечения изображений из Glide . get ( mContext ); loadUserImage ( userImageUrl ); // ждать 5 секунд, прежде чем повторять попытку int imageLoadingTimeOut = mContext . getResources (). GetInteger ( R . целое число . image_loading_time_out ); if ( imageLoadingTimeOut > 0 ) { новый таймер (). расписание ( новый TimerTask () { @Override public void run () { if (! mUserImageLoaded ) { loadUserImage ( userImageUrl ); } } }, imageLoadingTimeOut ); } } поток? Я продолжаю утверждать:

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

но согласно этой теме, он должен работать:

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

Тем не менее, я не могу заставить его работать, если я не назову его из основного потока.

Вот что я пытаюсь сделать из основного потока:

into(ImageView)

и loadUserImage:

Glide

и mContext - это всего лишь активность этого «указателя».

В любом случае, могу ли я использовать Glide из потока, отличного от основного?

android,multithreading,android-glide,

10

Ответов: 3


7 принят

backgroundМетод Glideтребует , чтобы называть его только на главном потоке, но когда вы передаете нагрузку на таймер будет выполняться в backgroundпотоке.

То, что вы можете сделать, - это получить get () путем вызова into()вместо этого bitmapи затем установить bitmapего ImageViewпри вызове setImageBitmap().

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

Вы также можете ознакомиться с этим документом для получения дополнительной информации.


6

Проводка кода на всякий случай, когда это помогает кому-то.

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

1

Обновить изображение в главной строке

runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Glide.with(MainActivity.this)
                                    .load("image URL")
                                    .into(imageView);
                        }
                    });
андроид, многопоточность, андроид-глиссады,
Похожие вопросы