簡體   English   中英

kotlin協程的正確使用方法

[英]Right way for use kotlin coroutine

我正在使用 kotlin coroutinescope 從視頻 uri 加載縮略圖,並在線性布局中添加 imageview 和該位圖。

目前在加載所有縮略圖之后,我正在添加到線性布局中。 任何人都可以建議我逐個獲取bitmao並添加到linearlayout中嗎?

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)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM