图像URL使用线圈在JetPack组合中使用线圈| Erselan Khan
#android #jetpack #组成 #coil

今天,我们将向您展示如何使用JetPack组合中的Coil将图像URL转换为位图。但是在进行前进之前,我想请您遵循我的帐户,以获取有关Android和其他技术相关主题的最新更新。

Image description

什么是线圈?

由Kotlin Coroutines支持的Android的图像加载库。线圈是:

  1. - 快速:线圈执行许多优化,包括内存和磁盘缓存,在内存中删除图像,自动暂停/取消请求等等。
  2. - 轻量级:线圈向您的APK添加〜2000方法(对于已经使用Okhttp和Coroutines的应用程序),它与毕加索相当,并且比Glide和Fresco少得多。
  3. - 易于使用:COIL的API利用Kotlin的语言功能来简化和最小的样板。
  4. - Modern :线圈是Kotlin-First,使用现代图书馆,包括Coroutines,Okhttp,Okio和Androidx Lifecycles。

执行:

我已经在JetPack组成的情况下做了这个示例,但是我们也可以在没有JetPack组成的情况下这样做。让我们创建一个活动:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            JetpackComposeUtilsTheme {
                val scope = rememberCoroutineScope()
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {
                    urlToBitmap(
                        scope = scope,
                        imageURL = "https://cdn.pixabay.com/photo/2015/04/23/22/00/tree-736885_960_720.jpg",
                        context = LocalContext.current,
                        onSuccess = {
                            it
                        },
                        onError = {
                            it
                        }
                    )
                }
            }
        }
    }
}

我们创建了一种方法,即:urltobitmap,它采用了一些参数,例如coroutine范围,图像URL和上下文。在成功和错误的情况下,它还给予回调。

我们正在使用rememcoroutinescope()使CoroutinesCope实例传递我们的函数以使用dispatcher.io。
加载图像数据。

fun urlToBitmap(
    scope: CoroutineScope,
    imageURL: String,
    context: Context,
    onSuccess: (bitmap: Bitmap) -> Unit,
    onError: (error: Throwable) -> Unit
) {
    var bitmap: Bitmap? = null
    val loadBitmap = scope.launch(Dispatchers.IO) {
        val loader = ImageLoader(context)
        val request = ImageRequest.Builder(context)
            .data(imageURL)
            .allowHardware(false)
            .build()
        val result = loader.execute(request)
        if (result is SuccessResult) {
            bitmap = (result.drawable as BitmapDrawable).bitmap
        } else if (result is ErrorResult) {
            cancel(result.throwable.localizedMessage ?: "ErrorResult", result.throwable)
        }
    }
    loadBitmap.invokeOnCompletion { throwable ->
        bitmap?.let {
            onSuccess(it)
        } ?: throwable?.let {
            onError(it)
        } ?: onError(Throwable("Undefined Error"))
    }
}

我们将图像加载到Coroutine范围内,并在其完成情况下进行回调。我们在错误的情况下取消了Coroutine作业,并将错误消息传递给Coroutine cancel()函数。

Coroutine作业完成后,我们得到了InvokeonCompletion的回调。我们检查了位图对象是否为null,如果不是null,则我们调用onSuccess,否则我们将调用OnError。

项目github链接:https://github.com/arsalankhan994/jetpack-compose-utils

现在。我将在即将发表的文章中介绍有关Android,Java,Kotlin和Springboot的更多主题。如果您喜欢这篇文章,请尽可能拍手。

如果您错过了:ðä

通过与您的其他开发人员分享这篇文章,并遵循我的媒介帐户 -

,向您展示您的爱。

(关注我以获取有关Android,Kotlin和其他技术的更多内容。如果您有任何疑问,请继续问我在这里或通过电子邮件发送给arsalankhan994@gmail.com,我会尽力回应。)