android - Android 从 AsyncTask kotlin 中的 doInBackGround() 获取结果
问题描述
我正在制作一个函数来计算来自 android 设备的以“.mp3”结尾的文件,并且在从 AsyncTask 获取结果时遇到了麻烦。我怎么才能得到它?这是我的 AsyncTask 类
class CountAsyncTask: AsyncTask<String, Int, Int>() {
private val root = Environment.getExternalStorageDirectory().path + "/Zing MP3"
override fun doInBackground(vararg params: String?): Int {
val a: ArrayList<File> = ArrayList()
val files = File(root).listFiles()!!
for (i in files.indices) {
if (files[i].name.endsWith(".mp3"))
a.add(files[i])
}
Log.e("Counting", a.size)
return a.size
}
override fun onPostExecute(result: Int?) {
super.onPostExecute(result)
}
override fun onProgressUpdate(vararg values: Int?) {
super.onProgressUpdate(*values)
}
}
这是我的活动代码
fun countSongsOnDevice() {
if (!checkPermissionForReadExtertalStorage()) {
requestPermissionForReadExtertalStorage()
} else {
CountAsyncTask().execute()
//totalSongsOnDevice = ....
}
}
谢谢
解决方案
你应该对“onPostExecute”方法中的结果做任何你想做的事情。此方法在 UI 线程上执行,因此您可以引用 UI 元素或您想要使用后台任务结果调用的任何逻辑。
最好的方法是从 onPostExecute 方法调用您的主要活动的某些方法,该方法使用结果显示给用户或您想要的任何内容
推荐阅读
- python - `pip install` 红色警告的最佳实践?
- android - 如何查看按ID排序的RecyclerView项目?
- java - clone() 方法是否必须克隆对象中所有级别中的所有引用?
- emacs - 在 Emacs 26.1 中挂钩新的行号模式不起作用
- c++ - 5 CPU的Task调度N个进程
- node.js - 我可以使用原生 es6 模块 (mjs) 对本地模块使用裸导入吗?
- python - ReverseMatch 适用于 jsonResponse 但不适用于渲染
- sql - oracle中如何修改OBJECT TYPE TABLE的大小
- c# - 如何获取参数的名称?
- python - 在三个 DataFrame 中寻找复合键的存在,并相应地连接 DataFrame