Glide - как получить растровое изображение в runnable

Я хочу загрузить свое изображение в растровое изображение, используя Glide, но это вызывает ошибку

java.lang.IllegalArgumentException: этот метод необходимо вызывать в фоновом потоке по адресу com.bumptech.glide.util.Util.assertBackgroundThread(Util.java:141) по адресу com.bumptech.glide.request.RequestFutureTarget.doGet(RequestFutureTarget.java).:186) по адресу com.bumptech.glide.request.RequestFutureTarget.get(RequestFutureTarget.java:108) по адресу extend.BitmapLoader.loadBitmapFromFile_Glide(BitmapLoader.java:60)

это мой код:

_runnable_animation = new Runnable() {
            @Override
            public void run() {
                bm = get_bitmap();
            }
};

_handler_animation.postDelayed(_runnable_animation, _RUNNABLE_THREAD_DELAY);

и это мой метод get_bitmap():

try {
        return Glide.with(context)
                    .asBitmap()
                    .load(new File(path))
                    .submit(500, 500)
                    .get();
        } catch (InterruptedException e) {
            e.printStackTrace();
            return null;
        } catch (ExecutionException e) {
            e.printStackTrace();
            return null;
        }

4 ответа

Ответ @NJ был достаточно хорош, но все же, если вы хотите, чтобы ваш метод получил эту работу, создайте обработчик фонового потока вместо обработчика основного потока. здесь я изменил ваш код, чтобы заставить это работать.

HandlerThread bgThread = new HandlerThread("BitmapLoaderThread");
bgThread.start();

// initialize your _handler_animation  like below
Handler _handler_animation = new Handler(bgThread.getLooper());

Runnable _runnable_animation = new Runnable() {
    @Override
    public void run() {
      bm = get_bitmap();
    }
};

_handler_animation.postDelayed(_runnable_animation, _RUNNABLE_THREAD_DELAY);

Сделайте также уборку, лучше место для деятельности #onDestroy

  @Override
  public void onDestroy() {
    _handler_animation.getLooper().quit();
    super.onDestroy();
  }

Я использую метод ниже для получения растрового изображения

 public static void loadBitmapFromServer(Context context, String url, final OnBitmapLoadedListener callback) {
        try { 
     Glide.with(context).load(url)
                            .asBitmap()
                            .priority(Priority.IMMEDIATE)
                            .listener(new RequestListener<String, Bitmap>() {
                                @Override
                                public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) {
                                    return false;
                                }

                                @Override
                                public boolean onResourceReady(Bitmap resource, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
                                    // you can do whatever you want to do with Bitamp
                                    callback.onBitmapLoaded(resource);
                                    return false;
                                }
                            });
              } catch (Exception e) {}
        }

Объявить интерфейс как

 public interface OnBitmapLoadedListener {
        void onBitmapLoaded(Bitmap resource);
    }

Убедитесь, что вы начали новую тему, как показано ниже

mThread = new Thread(_runnable_animation);
mThread.start();

Вы должны определить переменную точечного рисунка глобально, как это:

Bitmap bitmap;

Glide.with(context).load(url)
                    .asBitmap()
                    .listener(new RequestListener<String, Bitmap>() {
                        @Override
                        public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) {
                            return false;
                        }

                        @Override
                        public boolean onResourceReady(Bitmap resource, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
                            // After getting bitmap
                            bitmap = resource
                            return false;
                        }
                    });
Другие вопросы по тегам