Android compose onclick asyncimage один URL-адрес возвращает случайное изображение, когда URL-адрес снова вызывается

Как и в заголовке, мне нужно обновить изображение, когда я получил тот же URL-адрес, этот URL-адрес всякий раз, когда вызывается, возвращает случайное изображение.

Получил код, который работает, когда URL отличается:

var model by remember { mutableStateOf(URL) }
AsyncImage(
    model = model,
    contentDescription = "",
    modifier = Modifier.clickable(onClick = {
        model = newUrl
    })
)

Но мне нужно вызвать тот же URL, который возвращает случайное изображение:

var model by remember { mutableStateOf(URL) }
AsyncImage(
    model = model,
    contentDescription = "",
    modifier = Modifier.clickable(onClick = {
        model = URL //this is what I need
    })
)

Вы можете проверить этот пример:

URL = https://cataas.com/cat вы будете видеть случайного кота каждый раз, когда обновляете страницу.

0
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вам нужно перезагрузить изображение с тем же URL-адресом, вы можете сделать что-то вроде этого в Coil:

var requestId by remember { mutableStateOf(0) }
val imageRequest = ImageRequest.Builder(LocalContext.current)
    .data(data)
    .memoryCachePolicy(CachePolicy.DISABLED)
    .diskCachePolicy(CachePolicy.DISABLED)
    .setParameter("requestId", requestId, memoryCacheKey = null)
    .build()

AsyncImage(
    model = imageRequest,
    contentDescription = "",
    modifier = Modifier.clickable(onClick = {
        requestId++
    })
)

Идея setParameter взята из этого выпуска: https://github.com/coil-kt/coil/issues/884. Изменение параметра приводит к повторному выполнению запроса катушкой. Вы также должны отключить кеш, потому что, в отличие от проблемы, в этом случае запрос был выполнен успешно.

Этот код не работает. Я проверю это по ссылке.

acakojic 09.05.2023 20:42

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

Jan Bína 09.05.2023 23:03

Кроме того, отключение кеша в этом примере в любом случае является хорошей идеей, я думаю, вы не хотите накапливать изображения кошек в своей памяти :D

Jan Bína 09.05.2023 23:06

Да, в этом примере мне не нужен кеш :D У меня нет опыта с кешированием в памяти или на диске.. Если понять, кеширование, если оно включено, сохранит изображение в памяти, и оно будет потеряно, когда я убью приложение или что? Это почему кеш важен? Пожалуйста, поправьте меня, если я ошибаюсь, пытаясь понять, как работает кэширование.

acakojic 10.05.2023 00:04

Да, у катушки есть два типа кэширования, память и диск. Память для всех изображений, диск только для изображений, загруженных из Интернета. Кое-что об этом можно прочитать здесь: coil-kt.github.io/coil/image_loaders/#caching Как только вы загрузите изображение, оно будет сохранено в кэше диска, и вам не придется загружать его снова, даже после того, как приложение будет убито. В конечном итоге его можно заменить другими изображениями в кеше, если их у вас много.

Jan Bína 10.05.2023 00:31

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

Jan Bína 10.05.2023 00:35

Теперь более понятно, что такое кеширование :-)

acakojic 10.05.2023 00:56

Другие вопросы по теме