Решено: у меня была проблема с одновременной модификацией, которая, по моему мнению, была вызвана вызовом моего фильтра до того, как задача была выполнена, и в итоге мне удалось добавить вызов внешнего метода в 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
}
}
Он выполняется в mainCctivity 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")
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)
}