如何在 doInBackgroung() 时制作 android AsyncTask 加载微调器

Posted

技术标签:

【中文标题】如何在 doInBackgroung() 时制作 android AsyncTask 加载微调器【英文标题】:How do I make a android AsyncTask loading spinner while doInBackgroung() 【发布时间】:2020-12-16 15:16:33 【问题描述】:

我有一个用于 URL 连接的 AsyncTask。现在我希望每次进行 URL 连接时都有一个加载微调器。我在onPreExecute() 中显示加载微调器,并在onPostExecute 中将其关闭。 我在doInBackgroung() 中用一个无穷无尽的while 循环对此进行了测试。 最大的问题是 GUI 冻结并且未显示加载微调器。 我认为原因是URLconnection.execute().get()。但我需要 get() 因为活动需要结果才能使用它。

我现在的问题是:实现我的愿望的最佳方法是什么? (顺便说一句,使用“AsyncTask 解决方案”获得解决方案并不重要,因为可能有更好的解决方案,并且 AsyncTask 将在 SDK 版本 30 中被弃用)

非常感谢您,祝您身体健康!

【问题讨论】:

【参考方案1】:

正如你所说,AsyncTask 将被弃用。 所以还是换个方式比较好。

既然您提到您不依赖 AsyncTask,我将向您介绍另一种方法。

让我向您介绍coroutines,并说服您他们会解决您的问题并“完成工作”。

当我了解协程时,this video 是第一个向我展示了在我的应用程序中使用协程的潜力的示例之一。那时我还在使用 100% Java,可能就像你现在一样。

好的部分是:getting started with Kotlin is really easy!不仅可以从 Java 代码调用 Kotlin 函数,还可以从 Kotlin 代码调用 Java 函数。

要在 Kotlin 中“在后台做某事”,您需要做的就是 launch 一个协程(在后台线程上)。 你有一个 ViewModel 来获取你的数据吗?如果可以选择将此文件传输到 kotlin,那么启动(和确定范围)协程将变得像 this 一样简单。 对于片段或活动,您也可以使用其他应对方式。但是,通常不鼓励使用global scope。

执行协程就这么简单:

class MyViewModel: ViewModel() 
    fun loadDataInBackgroundAndShowSpinner 
        viewModelScope.launch 
            // Coroutine that will be canceled when the ViewModel is cleared.

           // start your spinning

           // do all the heave data work on a background thread
           doInBackground()

          // end your spinning here
        
    

    suspend fun doInBackground(inputURL: String) 
        withContext(Dispatchers.IO) 
            // Execute all your data fetching here
            ...
            // Assign your data to your viewModel variables, post it to a LiveData object, etc.
        
    

您不需要主线程中的任何循环或任何东西。通过在后台线程上使用withContext,您可以实现main-safety。 在启动的协程中,所有内容(默认情况下)都会按顺序执行。 你仍然不会阻塞主线程。你是怎么做到的? 这里的关键是您的doInBackground 函数具有suspend 关键字。因此,您在主线程上的 loadDataInBackgroundAndShowSpinner 将“暂停”您的 doInBackground 函数,并且主线程可以做任何您想做的事情(即没有冻结)。然后,一旦您的 doInBackground 完成,它将恢复执行,您可以在主线程上再次关闭您的微调器。

Kotlin coroutines make it so much easier to do something in the background 我真的很想鼓励你试一试!它肯定会解决您的问题,我想不出更简单的方法。 Google 还试图让get you started when coming from Java 尽可能简单。

【讨论】:

以上是关于如何在 doInBackgroung() 时制作 android AsyncTask 加载微调器的主要内容,如果未能解决你的问题,请参考以下文章

如何在以编程方式制作滚动视图时解决此问题?

如何在悬停时制作 Bootstrap 的下拉菜单?

在 Xcode 中制作 iPhone App 时,如何在手机不添加默认玻璃效果眩光的情况下制作 app 图标?

更新注释视图时如何在自定义注释引脚中制作动画

我如何在获取 assoc 时制作表格

到达一端时如何在点击滑块上制作无限过渡效果? (过渡问题)