Скользящая несогласованная загрузка в течение цикла - PullRequest
1 голос
/ 13 апреля 2020

Я пишу приложение Android, в котором я хочу отображать согласованный поток, используя новейшую версию Glide 4.11.0. Моя идея состояла в том, чтобы каждые 100 мс отображать новое изображение, используя для l oop, где я вызываю функцию Glide. Когда я запускаю свою функцию loadImageFromURL(), она запускается и впоследствии отображает все изображения как можно быстрее друг за другом, но я хочу, чтобы она отображалась равномерно с промежутком времени около 100 мс.

Что такое Я делаю не так? Есть ли проблема с внутренней резьбой Glide?

Мой код:

public void loadImageFromURL() {
        Glide.get(this).setMemoryCategory(MemoryCategory.HIGH); //use more RAM than normal
        final long Start = System.currentTimeMillis();

        for (int i = 0; i < 5; imageNumber++) {         //for loop for displaying continuously stream
            if (System.currentTimeMillis() > Start + i * 100) {
                Glide.with(this).asBitmap().load(ImageURL).diskCacheStrategy(DiskCacheStrategy.NONE).override(ScreenSizeX, ScreenSizeY).into(new CustomTarget<Bitmap>(){
                    @Override
                    public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                        _imageView.setImageBitmap(resource);
                        imageNumber++;
                    }
                    @Override
                    public void onLoadCleared(@Nullable Drawable placeholder) {

                    }
                });
                i++;
            }
        }
    Glide.get(this).setMemoryCategory(MemoryCategory.NORMAL); //RAM usage back to normal
    }

1 Ответ

1 голос
/ 13 апреля 2020

Есть несколько fl aws с вашим кодом. Glide загружает изображения в отдельном потоке, поэтому он запускает код загрузки независимо от вашего l oop. Некоторые проблемы:

  1. Вы управляете imageNumber из нескольких потоков. Это приведет к случайным чувствительным ко времени проблемам. Вы не должны увеличивать imageNumber в onResourceReady
  2. l oop будет бесконечно l oop, пока не будет достигнуто желаемое время. Это вызовет большую загрузку ЦП и может быть решено с помощью блокировок, ожиданий или подобного.

Мое предложение: Попробуйте загрузить каждое изображение за другим синхронно с решением из этого ответа . Когда изображение загружено, подсчитайте, сколько времени осталось до прохождения «перерыва загрузки изображения», и используйте Thread.sleep(milliSeconds) для ожидания оставшегося времени. Затем вы можете обновить imageView.

Убедитесь, что вы запускаете этот код в отдельном потоке и используете runOnUIThread при обновлении imageView.

Вероятно, вы можете дополнительно оптимизировать это, используя ConcurrentQueue, где загрузка всех изображений происходит одновременно, и отдельный потребительский поток берет из очереди и ожидает между ними. Это, вероятно, приведет к более высокому использованию памяти, поскольку изображения также будут храниться в очереди.

...