android - 如何知道异步任务何时在android studio中完全完成?
问题描述
已解决: 我遇到了并发修改问题,我认为这是由于在任务完成之前调用了我的过滤器,最终对我有用的是在 onPostExecute 中添加对外部方法的调用,该方法将值复制到 copyonwritearraylist。
所以我有一个 AsyncTask 从网站解析 json 并在完成后初始化一个列表。
inner class GetSchoolAsync : AsyncTask<String, String, String>() {
lateinit var list: MutableList<Info>
override fun onPreExecute() {
// Before doInBackground
}
override fun doInBackground(vararg urls: String?): String {
var urlConnection: HttpURLConnection? = null
try {
val url = URL(urls[0])
urlConnection = url.openConnection() as HttpURLConnection
urlConnection.connectTimeout = CONNECTON_TIMEOUT_MILLISECONDS
urlConnection.readTimeout = CONNECTON_TIMEOUT_MILLISECONDS
val inString = urlConnection.inputStream.bufferedReader().readText()
publishProgress(inString)
} catch (ex: Exception) {
println("HttpURLConnection exception" + ex)
} finally {
if (urlConnection != null) {
urlConnection.disconnect()
}
}
return " "
}
override fun onProgressUpdate(vararg values: String?) {
try {
var list = mutableListOf<Info>()
var data = Gson().fromJson(values[0], Read::class.java)
for(item in data.schools){
list.add(item)
// println(item)
}
this.list = list
} catch (ex: Exception) {
println("JSON parsing exception" + ex.printStackTrace())
}
}
override fun onPostExecute(result: String?) {
// Done
schoolList = this.list
}
}
它与另一个渲染地图的异步函数一起在 mainactivity OnCreate 中执行。学校列表是主要活动中的私有lateinit var。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_maps)
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
GetSchoolAsync().execute("https://code.org/schools.json")
mapFragment.getMapAsync(this)
}
我需要知道 json 部分何时完成并初始化列表,以便我可以向地图添加标记。每当我尝试在调试器中检查异步任务的状态时,它总是显示它处于挂起状态或正在运行。我什么时候可以确定它完成了?
解决方案
您应该更好地为您的案例使用接口
interface ReturnListener {
fun result(result:String)
}
inner class GetSchoolAsync : AsyncTask<Object, String, String>() {
lateinit var list: MutableList<Info>
override fun onPreExecute() {
// Before doInBackground
}
override fun doInBackground(vararg urls: Object?): String {
var urlConnection: HttpURLConnection? = null
var listener: ReturnListener? = null
try {
val url = URL(urls[0] as String)
listener = urls[1] as ReturnListener
urlConnection = url.openConnection() as HttpURLConnection
urlConnection.connectTimeout = CONNECTON_TIMEOUT_MILLISECONDS
urlConnection.readTimeout = CONNECTON_TIMEOUT_MILLISECONDS
val inString = urlConnection.inputStream.bufferedReader().readText()
publishProgress(inString)
} catch (ex: Exception) {
println("HttpURLConnection exception" + ex)
} finally {
if (urlConnection != null) {
urlConnection.disconnect()
}
}
return " "
}
override fun onProgressUpdate(vararg values: String?) {
try {
var list = mutableListOf<Info>()
var data = Gson().fromJson(values[0], Read::class.java)
for(item in data.schools){
list.add(item)
// println(item)
}
this.list = list
} catch (ex: Exception) {
println("JSON parsing exception" + ex.printStackTrace())
}
}
override fun onPostExecute(result: String?) {
// Done
schoolList = this.list
if (listener!=null)
listener.result(result)
}
在 OnCreate 下:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_maps)
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
GetSchoolAsync().execute("https://code.org/schools.json", object: ReturnListener{
override fun result(result:String) {
//ToDo: .......
}
})
mapFragment.getMapAsync(this)
}
推荐阅读
- sql - 比较逗号分隔值和逗号分隔值 SQL
- python - 如何在csv_file中显示数据一字一格而不是一字一格?
- jdbc - 当新记录插入或更新数据库表中的现有记录时,如何 Hazelcast jet JDBC 继续源获取数据?
- java - 使用 Jackson 将 Java8 LocalDateTime 序列化为 UTC 时间戳
- swift - 编写一个返回自身的 Swift 函数
- javascript - 无法设置未定义的属性“道具”
- apache-camel - 用骆驼创建报告
- r - 随机选择ggtheme
- javascript - 如何从 youtube 嵌入 HTML 正则表达式嵌入 url?
- tkinter - 如何更新 tkinter 子帧类中的标签文本