繁体   English   中英

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

[英]How do I make a android AsyncTask loading spinner while doInBackgroung()

我得到了一个用于 URL 连接的 AsyncTask。 现在我想在每次进行 URL 连接时都有一个加载微调器。 我显示加载微调onPreExecute()和驳回onPostExecute 我在doInBackgroung()无限的while循环对此进行了测试。 最大的问题是 GUI 冻结并且未显示加载微调器。 在我看来,原因是URLconnection.execute().get() 但是我需要 get() 因为活动需要结果才能使用它。

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

非常感谢您并保持健康!

正如你所说的 AsyncTask 将被弃用。 所以最好是另一种选择。

既然你提到你不依赖 AsyncTask,我将向你展示另一种方法。

让我向您介绍协程并让您相信它们会解决您的问题并“完成工作”。

当我开始了解协程时,这个视频是第一个向我展示在我的应用程序中使用协程的潜力的例子之一。 那时我仍在使用 100% Java,可能就像你现在一样。

好的部分是:开始使用 Kotlin 真的很容易 您不仅可以从 Java 代码调用 Kotlin 函数,还可以从 Kotlin 代码调用 Java 函数。

要在 Kotlin 中“在后台做某事”,您需要做的就是launch一个协程(在后台线程上)。 你有一个 ViewModel 来获取你的数据吗? 如果是传送该文件到科特林,一个选项,然后开始(和范围界定)协程变得越简单 对于片段或活动,您也可以使用其他应对方式。 但是,通常不鼓励使用全局作用域

执行协程就是这么简单:

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 协程让在后台做某事变得更加容易,我真的很想鼓励你尝试一下! 它肯定会解决您的问题,我想不出更简单的方法。 Google 还试图 让您在使用 Java 时尽可能轻松地 入门

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM