在这种情况下如何用 RxJava 替换 AsyncTask

Posted

技术标签:

【中文标题】在这种情况下如何用 RxJava 替换 AsyncTask【英文标题】:How to replace AsynTask with RxJava in this case 【发布时间】:2021-08-01 00:57:06 【问题描述】:

我有一个可以减少图像的类,但我目前正在使用 AsyncTask,现在我想替换它,因为 AsyncTask 现在已弃用。所以有人可以帮助我解决问题

这是我的代码:

class DecreaseImageTask(
    val uri: Uri? = null,
    val bitmap: Bitmap? = null,
    var context: Context,
    var listener: (String?) -> Unit
) : AsyncTask<Void, Long, String?>() 

    override fun doInBackground(vararg params: Void?): String? 
        return when 
            uri != null -> 
                decreaseImageSize(imagePath = FileUtils.getPathURI(context, uri) ?: "")
            
            bitmap != null -> 
                decreaseImageSize(bitmap = bitmap)
            
        
    

    override fun onPostExecute(result: String?) 
        super.onPostExecute(result)
        listener(result)
    


【问题讨论】:

【参考方案1】:

您可以更改 decreaseImageSize 以接受回调作为参数。 在这种情况下,函数将不再需要返回一个字符串,该字符串作为参数传递给回调函数,然后用作 正文中的参数:

fun decreaseImageSize(imagePath: String? = null, bitmap: Bitmap? = null, callback: (String) -> Unit) 
    ...

    val result = "" // The result of the previous decreaseImageSize function

    callback(result)

然后,不要调用AsyncTask,而是使用新的decreaseImageSize 函数:

    decreaseImageSize(imagePath = FileUtils.getPathURI(context, uri) ?: "")  result -> 
        // Execute the code after the image is decreased
    

    decreaseImageSize(bitmap = bitmap)  result -> 
        // Execute the code after the image is decreased
    

【讨论】:

以上是关于在这种情况下如何用 RxJava 替换 AsyncTask的主要内容,如果未能解决你的问题,请参考以下文章

将房间数据库的 AsyncTask 替换为 Rxjava

CentOS下如何用nmon收集系统实时运行状况

如何用 Promise.all 替换多个 async/await 调用?

Linux下如何用命令查看当前目录下所有文件的大小,以行数和字节为单位?

LINUX下如何用gethostname命令

Cmake是啥?有啥用?在WINDOWS下如何用