Nano Hash - криптовалюты, майнинг, программирование

Многозадачность с Glide

У меня есть приложение для Android, которое должно работать как онлайн, так и офлайн, и я использую Glide для загрузки изображений. После загрузки базы данных я хочу запустить две задачи параллельно: загрузить все изображения на диск и загрузить все изображения, необходимые на текущем экране (а затем на следующих экранах). Проблема в том, что количество загружаемых изображений очень велико, а изображения, запрошенные для текущего экрана, добавляются в конец одной и той же очереди загрузки. Таким образом, я получаю «пустые» экраны, пока все изображения не будут загружены в кеш диска. Как заставить эти задачи работать параллельно?

public class GlideActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_glide);
        downloadAllImages();
        updateUi();
    }

    private void updateUi() {
        ImageView imageView1 = (ImageView) findViewById(R.id.image_view1);
        ImageView imageView2 = (ImageView) findViewById(R.id.image_view2);
        ImageView imageView3 = (ImageView) findViewById(R.id.image_view3);
        cachedGlideRandomRequest().into(imageView1);
        cachedGlideRandomRequest().into(imageView2);
        cachedGlideRandomRequest().into(imageView3);
    }

    private void downloadAllImages() {
        for (int i = 0; i < 50; i++) {
            cachedGlideRandomRequest().preload();
        }
    }

    private DrawableRequestBuilder<String> cachedGlideRandomRequest() {
        return Glide.with(getApplicationContext())
                .load("https://unsplash.it/200/300?image=" + System.nanoTime() % 1000)
                .diskCacheStrategy(DiskCacheStrategy.SOURCE);
    }
}

Я хочу показывать изображения в ImageViews, пока downloadAllImages() все еще работает в фоновом режиме.

04.04.2016

Ответы:


1

Похоже, у Glide есть элегантное решение для моего случая. Это метод priority(). Это позволяет установить НИЗКИЙ приоритет для «загрузить все» и НЕМЕДЛЕННЫЙ для изображения «на экране». Вот некоторые об этом API. И код, которым я закончил:

private void downloadAll(List<String> imageUrls) {
    for (String image : imageUrls) {
        Glide.with(this).load(image).priority(Priority.LOW).preload();
    }
}

private void downloadOnScreen(ImageView imageView, String imageUrl) {
    Glide.with(this).load(imageUrl).priority(Priority.IMMEDIATE).into(imageView);
}
06.04.2016

2

Вы можете установить изображение-заполнитель для немедленного отображения:

cachedGlideRandomRequest()
    .placeholder(R.drawable.resource_to_show_now)
    .into(imageView1);
04.04.2016
  • Не совсем то, что я ищу, но хороший обходной путь. 05.04.2016
  • Что именно вы ищете? 05.04.2016
  • Я пытаюсь создать две очереди загрузки или два экземпляра Glide. Тогда я смогу загрузить все в службе, продолжая загружать необходимые изображения для действий. 05.04.2016
  • И вызов updateUI перед загрузкойAllImages не работает, если очередь работает так, как вы подозреваете? 05.04.2016
  • Это работает для этого действия, но после перехода к следующему очередь загрузки кажется загруженной на очень долгое время вперед. И изображения появляются в пользовательском интерфейсе только после завершения загрузки. 05.04.2016
  • Да, Glide на самом деле не собирается управлять сколь угодно большим количеством загрузок за вас. Проблема, которую он пытается решить, заключается в том, чтобы получить изображение в ImageView по запросу, а затем отменить его, когда оно больше не нужно. Если вы хотите управлять кешем контента с определенным поведением, лучше всего сделать это самостоятельно, а Glide будет работать с вашим собственным управляемым кешем. 06.04.2016
  • К сожалению, вы были неправы. Я только что нашел способ решить эту проблему, установив приоритеты запросов. Подробности смотрите в моем ответе. 06.04.2016
  • Имейте в виду, что описанные приоритеты не реализуют отдельные очереди, как вы просили, и не дают гарантии упорядочения. В частности, я бы предположил, что если вы застопорили запросы с низким приоритетом, которые в настоящее время обрабатываются и занимают максимальное количество потоков загрузки, это может помешать обработке изображений с более высоким приоритетом. Я бы по-прежнему определенно ставил в очередь запросы с высоким приоритетом перед остальными. 07.04.2016
  • Да, это не идеальное решение, но все же оно решает проблему просто отлично. 07.04.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..