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