var datasFromApi:ArrayList = arrayListOf()
btnNextCharacter.setOnClickListener(View.OnClickListener {
if(checkForInternetConnection()) {
try {
val innerClassObject = DownloadingCharacterTask()
innerClassObject.execute()
}catch (e: Exception){
e.printStackTrace()
}
}
}
内部类DownloadingCharacterTask:AsyncTask>(){
override fun doInBackground(vararg params: String?): List<Characters>? {
var parseCharacter = ParseCharacterUtility()
return parseCharacter.parseCharacterObjectFromJSONData()
}
override fun onPostExecute(result: List<Characters>?) {
super.onPostExecute(result)
var numberOfCharacters = result?.size ?: 0
var index: Int = 0
while (index < result!!.size) {
datasFromApi[index].name = result[index].name
datasFromApi[index].height = result[index].height
datasFromApi[index].mass = result[index].mass
datasFromApi[index].gender = result[index].gender
datasFromApi[index].birthYear = result[index].birthYear
}
}
}
AsyncTasks
使用3个类型参数,即
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
}
从docs:
- Params,执行时发送给任务的参数类型。
- Progress,后台计算过程中发布的进度单位的类型。
- Result,背景计算结果的类型。
您可以使用Result类型返回一些值并将其存储在某些全局变量中。
话虽如此,您应该重新考虑使用AsyncTask
(这是过去的可怕事情),而Android即将淘汰这个怪物。希望有帮助。
尝试一下,
datasFromApi = innerClassObject.execute().get();
它可以获得一个返回值,但是在那个时候阻塞了UIThread。也就是说,使用get()时,它在获取返回值时是同步而不是异步的。如果没有与UI相关的处理,则可以使用get()。