Я работаю над проектом, в котором строго используются многомодульные функции по аркам слоев. Означает, что приложение разделено на функции, и каждая функция имеет собственный пользовательский интерфейс, домен и уровень данных.
Уровень пользовательского интерфейса зависит от уровня домена, который представляет собой чистую библиотеку Kotlin в соответствии со стандартом, который следует ниже. А уровень домена имеет только вариант использования и репозиторий (чистый интерфейс).
Уровень данных реализует это репо, что означает, что уровень данных зависит от уровня домена. Уровень данных и уровень пользовательского интерфейса — это библиотека Android, но уровень домена — это чистая библиотека Kotlin, что означает, что никакие вещи, связанные с Andorid, не могут получить оттуда доступ.
Теперь на уровне данных есть список изображений в виде растрового изображения. Но растровое изображение - это вещи Android, но уровень домена не может иметь его и не может иметь к нему доступ.
Так как же уровень пользовательского интерфейса может получить растровое изображение из уровня данных через уровень домена.
Фрагмент структуры папок

Фрагмент кода
Код: Выделить всё
private val semaphore = Semaphore(2) // it required due to i do async operation and without it MediaMetaData throw error and crash app.
suspend fun getImageVideoThumbnail(
context: Context,
uri: Uri,
size: Size = Size(200, 200)
): Bitmap? = withContext(Dispatchers.IO) {
var bitmap: Bitmap? = null
val cr = context.contentResolver
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
bitmap = cr.loadThumbnail(uri, size, null)
} else {
cr.query(uri, null, null, null, null)?.use { cursor ->
val idCol = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID)
while (cursor.moveToNext()) {
val id = cursor.getLong(idCol)
bitmap = MediaStore.Video.Thumbnails.getThumbnail(
cr,
id,
MediaStore.Video.Thumbnails.MINI_KIND,
null
)
break
}
}
}
bitmap
} catch (e: Exception) {
// e.printStackTrace()
getFrame(context , uri , size)
}
}
suspend fun getFrame(context: Context, uri: Uri , size : Size): Bitmap? = withContext(Dispatchers.IO) {
semaphore.withPermit {
val retriever = MediaMetadataRetriever()
try {
retriever.setDataSource(context, uri)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
retriever.getScaledFrameAtTime(
0,
MediaMetadataRetriever.OPTION_CLOSEST_SYNC,
size.width, size.height
)
} else {
retriever.frameAtTime?.let { src ->
src.scale(size.width, size.height).also { src.recycle() }
}
}
} catch (e: Exception) {
null
} finally {
retriever.release()
}
}
}
Я просто хочу прояснить, как слой пользовательского интерфейса может получать список изображений, не нарушая целостности уровня домена. Я думаю использовать ByteArray вместо растрового изображения и передать уровень данных на уровень домена. И слой домена на слой пользовательского интерфейса. На уровне пользовательского интерфейса этот ByteArray восстанавливается в растровом формате. Я думаю, лучший способ или нет?
Как лучше всего решить эту архитектурную проблему?
Подробнее здесь: https://stackoverflow.com/questions/798 ... ule-androi
Мобильная версия