Удаление глиссады

Я использую glide для извлечения растрового изображения из кеша и сохранения его в другом месте. Соответствующая функция ниже (на основе этого сообщения 🙂 не может вызвать извлечение. Фактически, строка журнала «Log.d (TAG,« О запуске извлечения »); Ниже никогда не срабатывает.

Любые идеи о том, почему простая целевая функция никогда не вызвана?

public byte[] extractImageFromCache(Context context, String pictureURL) { byte[] byteArray = new byte[0]; if (context != null && pictureURL != null && !pictureURL.isEmpty()) { final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); Glide.with(context) .load(pictureURL) .asBitmap() .toBytes() .diskCacheStrategy(DiskCacheStrategy.SOURCE) // Load the original hires image .into(new SimpleTarget<byte[]>() { @Override public void onResourceReady(final byte[] resource, GlideAnimation<? super byte[]> glideAnimation) { Log.d(TAG, "About to start extraction"); new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { Log.d(TAG, "Start extraction"); try { Log.d(TAG, "Image bytes len: " + resource.length); byteArrayOutputStream.write(resource); byteArrayOutputStream.flush(); } catch (IOException e) { e.printStackTrace(); Log.i(TAG, "Unable to load image: " + pictureURL); e.printStackTrace(); } return null; } }.execute(); } }); Log.d(TAG, String.format("Got image bytes: %d for %s", byteArrayOutputStream.size(), pictureURL)); return byteArrayOutputStream.toByteArray(); } return null; } 

Как вы уже упоминали, Log.d (TAG, «О запуске извлечения») никогда не запускается, что означает, что onResourceReady никогда не вызывается. Это может произойти из-за некоторой ошибки. Попробуйте переопределить обратные вызовы ошибок.

Чтобы определить проблему, я бы рекомендовал вам переопределить другие обратные вызовы SimpleTarget для отладки проблемы.

  @Override public void onLoadCleared(@Nullable Drawable placeholder) { // load has been cleared } @Override public void onLoadStarted(@Nullable Drawable placeholder) { // load has started } @Override public void onLoadFailed(@Nullable Drawable errorDrawable) { // load failed due to some reason, notify callers here about the same } 

Используя объект SimpleTarget, мы можем легко получить битмап, который мы пытаемся извлечь из кеша или сети, поскольку по умолчанию просматривается поиск в кеше.

Измените код загрузки Glide следующим образом:

  Glide.with(this) .load("https://cdn-images-1.medium.com/max/1200/1*hcfIq_37pabmAOnw3rhvGA.png") .asBitmap() .diskCacheStrategy(DiskCacheStrategy.SOURCE) .into(new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { Log.d("Size ", "width :"+resource.getWidth() + " height :"+resource.getHeight()); imageView.setImageBitmap(resource); storeImage(resource); } }); 

И использование этого или любого другого механизма для хранения растрового изображения для внешнего / внутреннего хранилища.

 private void storeImage(Bitmap image) { File pictureFile = getOutputMediaFile(); if (pictureFile == null) { Log.d(TAG, "Error creating media file, check storage permissions: ");// e.getMessage()); return; } try { FileOutputStream fos = new FileOutputStream(pictureFile); image.compress(Bitmap.CompressFormat.PNG, 90, fos); fos.close(); Log.d(TAG, "img dir: " + pictureFile); } catch (FileNotFoundException e) { Log.d(TAG, "File not found: " + e.getMessage()); } catch (IOException e) { Log.d(TAG, "Error accessing file: " + e.getMessage()); } } private File getOutputMediaFile(){ // To be safe, you should check that the SDCard is mounted // using Environment.getExternalStorageState() before doing this. File mediaStorageDir = new File(Environment.getExternalStorageDirectory() + "/Android/data/" + getApplicationContext().getPackageName() + "/Files"); if (! mediaStorageDir.exists()){ if (! mediaStorageDir.mkdirs()){ return null; } } File mediaFile; Random generator = new Random(); int n = 1000; n = generator.nextInt(n); String mImageName = "Image-"+ n +".jpg"; mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName); return mediaFile; } 

Я использую Glide ver 3.7

 compile "com.github.bumptech.glide:glide:3.7.0" 

Вот полный рабочий пример: https://github.com/nieldeokar/GlideApp

Прежде всего, ваш возврат недействителен, поскольку Glide выполняет запрос в асинхронном потоке. Таким образом byteArrayOutputStream никогда не заселяется вовремя до возвращения функции. Это означает, что ваша функция всегда будет возвращать пустой массив байтов. Это также означает ваш оператор журнала Log.d(TAG, String.format("Got image bytes: %d for %s", byteArrayOutputStream.size(), pictureURL)); Будет недействительным. Зная это, ваше сообщение About to start extraction будет отображаться после получения Got image bytes... Вам нужно будет переформатировать свой код, чтобы использовать обратные вызовы, чтобы уведомить вызывающего абонента о том, что ваш код получил массив. Что-то вроде этого:

 public interface GlideByteLoadCallback { void onBytesExtracted(byte[] bytes); void onFail(String message); } public void extractImageFromCache(Context context, String pictureURL, GlideByteLoadCallback callback) { if (context != null && pictureURL != null && !pictureURL.isEmpty()) { final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); Glide.with(context) .load(pictureURL) .asBitmap() .toBytes() .diskCacheStrategy(DiskCacheStrategy.SOURCE) // Load the original hires image .into(new SimpleTarget<byte[]>() { @Override public void onResourceReady(final byte[] resource, GlideAnimation<? super byte[]> glideAnimation) { Log.d(TAG, "About to start extraction"); new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { Log.d(TAG, "Start extraction"); try { Log.d(TAG, "Image bytes len: " + resource.length); byteArrayOutputStream.write(resource); byteArrayOutputStream.flush(); if (callback != null) callback.onBytesExtracted(byteArrayOutputStream.toByteArray()); } catch (IOException e) { e.printStackTrace(); Log.i(TAG, "Unable to load image: " + pictureURL); e.printStackTrace(); if (callback != null) callback.onFail("Extraction failed"); } } }.execute(); } }); } if (callback != null) callback.onFail("Invalid url"); } 

Затем назовите его:

 extractImageFromCache(context, picture, new GlideByteLoadCallback() { @Override public void onFail(String message) { // handle failure here } @Override public void onBytesExtracted(byte[] bytes) { // do stuff with bytes here } }); 

Это то, что я сделал бы.

Когда вы используете глиссирование, поместите загруженное изображение в изображение.

Из кода установите:

 imageView = (ImageView) view.findViewById(R.id.image_view); imageViewProfile.setDrawingCacheEnabled(true); imageViewProfile.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); 

Затем, чтобы получить растровое изображение из этого изображения, которое вы можете использовать

 imageView.getDrawingCache() //This returns a Bitmap 

Единственное, о чем вам следует беспокоиться, это проверить, завершил ли Glide загрузку вашего изображения или нет. Я не уверен, как это сделать, но попробуйте и дайте голосование, если это сработает для вас.