如何解决如何在doInBackgroung时使android AsyncTask加载微调框
我有一个用于URL连接的AsyncTask。现在,我想每次进行URL连接时都有一个加载微调器。我在onPreExecute()
中显示加载微调器,并在onPostExecute
中将其关闭。
我在while
中进行了无穷的doInBackgroung()
循环测试。
最大的问题是GUI冻结,并且未显示加载微调器。
我认为原因是URLconnection.execute().get()
。但是我需要get()因为活动需要结果才能使用它。
我的问题是现在:实现我的愿望的最佳方法是什么? (顺便说一句,使用“ AsyncTask解决方案”获取解决方案并不重要,因为可能会有更好的解决方案,并且SDK版本30将弃用AsyncTask)
非常感谢您并保持健康!
解决方法
如您所说,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尽可能容易。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。