android - kotlin协程的正确使用方法

标签 android android-layout kotlin kotlin-coroutines

我正在使用kotlin coroutinescope从视频uri加载thuntails,并在线性布局中添加图像图。

当前加载了所有thuntail之后,我将添加到线度上。谁能建议我一一获取bitmao并添加到线性布局中?

private fun loadThumbnails(uri: Uri) {
    val metaDataSource = MediaMetadataRetriever()
    metaDataSource.setDataSource(context, uri)

    val videoLength = (metaDataSource.extractMetadata(
            MediaMetadataRetriever.METADATA_KEY_DURATION).toInt() * 1000).toLong()

    val thumbnailCount = 8

    val interval = videoLength / thumbnailCount

    var listOfImage: ArrayList<Bitmap?> = ArrayList()

    for (i in 0 until thumbnailCount - 1) {

        try {
            var bitmap: Bitmap? = null
            val job = CoroutineScope(Dispatchers.IO).launch {
                val frameTime = i * interval
                bitmap = metaDataSource.getFrameAtTime(frameTime, MediaMetadataRetriever.OPTION_CLOSEST)

                bitmap?.let {
                    val targetWidth: Int
                    val targetHeight: Int
                    if (it.height > it.width) {
                        targetHeight = frameDimension
                        val percentage = frameDimension.toFloat() / it.height
                        targetWidth = (it.width * percentage).toInt()
                    } else {
                        targetWidth = frameDimension
                        val percentage = frameDimension.toFloat() / it.width
                        targetHeight = (it.height * percentage).toInt()
                    }
                    bitmap = Bitmap.createScaledBitmap(it, targetWidth, targetHeight, false)
                }
                listOfImage.add(bitmap)
                metaDataSource.release()
            }

        } catch (e: Exception) {
            e.printStackTrace()
        }

    }

    listOfImage.forEach {
        container_thumbnails.addView(ThumbnailView(context).apply { setImageBitmap(it) })
    }

}

最佳答案

请尝试下一个方法:

val job = CoroutineScope(Dispatchers.Main).launch {
    val frameTime = i * interval
    val bitmap = loadBitmap(frameTime) // loads bitmap asynchronously using withContext(Dispatchers.IO)

    // ... use bitmap to set into a view
}

suspend fun loadBitmap(frameTime: Int): Bitmap? = withContext(Dispatchers.IO) {
    bitmap = metaDataSource.getFrameAtTime(frameTime, MediaMetadataRetriever.OPTION_CLOSEST)

    bitmap?.let {
        val targetWidth: Int
        val targetHeight: Int
        if (it.height > it.width) {
             targetHeight = frameDimension
             val percentage = frameDimension.toFloat() / it.height
             targetWidth = (it.width * percentage).toInt()
        } else {
             targetWidth = frameDimension
             val percentage = frameDimension.toFloat() / it.width
             targetHeight = (it.height * percentage).toInt()
        }
        Bitmap.createScaledBitmap(it, targetWidth, targetHeight, false)
    }
}

关于android - kotlin协程的正确使用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62549104/

相关文章:

java - 如何通过在android中的.java文件中提供imgsrc来加载imageview

java - 如何在拖动事件中选择多个复选框

android - 缩放 AnimationDrawable 的大小

android - WorkManager 的定期工作请求不起作用

android - RxJava如何过滤子树然后返回树

java - 从 Activity 导航到 TabLayout/ViewPager fragment

android - 如何在 kotlin 中的 customadpter 项目上实现 clicklistener?

android - SavedStateViewModelFactory 用空构造函数构造

android - 文件无法在android webview中浏览

android - 创建一个安卓智能应用横幅