我有4个异步任务从互联网加载数据。同时,我用动画展示活动,当任务完成时,我需要启动另一个加载数据的活动。Android:等待多个任务完成
在科特林我的异步方法(同写在Java的异步任务)
private fun getArtistData(name: String) {
val getArtistDataAsync = object : AsyncTask<String, Void, Artist>() {
override fun doInBackground(vararg args: String?): Artist? {
Log.i(TAG, "Получаем данные в AsyncTask для $mArtistName")
Caller.getInstance().cache = null
return Artist.getInfo(args[0], "26cc2ebf6da38bc646733f661bfc6268");
}
override fun onPostExecute(result: Artist?) {
super.onPostExecute(result)
Log.i(TAG, "Возвращаем данные из AsyncTask для $mArtistName")
CommonUtilities.artistInstance = result as Artist;
}
}
val getTopTracksAsync = object : AsyncTask<String,Void,ArrayList<Track>>(){
override fun doInBackground(vararg args: String?): ArrayList<Track>? {
Log.i(TAG, "Получаем список песен в AsyncTask для $mArtistName")
Caller.getInstance().cache = null
return Artist.getTopTracks(args[0], "26cc2ebf6da38bc646733f661bfc6268") as ArrayList<Track>;
}
override fun onPostExecute(result: ArrayList<Track>?) {
super.onPostExecute(result)
Log.i(TAG, "Возвращаем список песен из AsyncTask для $mArtistName")
CommonUtilities.trackListInstance = result;
}
}
val getSimilarBandsAsync = object : AsyncTask<String,Void,ArrayList<Artist>>(){
override fun doInBackground(vararg args: String?): ArrayList<Artist>? {
Log.i(TAG, "Получаем список похожих групп в AsyncTask для $mArtistName")
Caller.getInstance().cache = null
return Artist.getSimilar(args[0], "26cc2ebf6da38bc646733f661bfc6268") as ArrayList<Artist>?
}
override fun onPostExecute(result: ArrayList<Artist>?) {
super.onPostExecute(result)
Log.i(TAG, "Возвращаем список похожих групп из AsyncTask для $mArtistName")
CommonUtilities.artistListInstance = result;
}
}
val getTopAlbumsAsync = object : AsyncTask<String,Void, ArrayList<Album>>(){
override fun doInBackground(vararg p0: String?): ArrayList<Album>? {
Log.i(TAG, "Получаем список альбомов в AsyncTask для $mArtistName")
Caller.getInstance().cache = null
return Artist.getTopAlbums(p0[0],"26cc2ebf6da38bc646733f661bfc6268") as ArrayList<Album>?;
}
override fun onPostExecute(result: ArrayList<Album>?) {
super.onPostExecute(result)
Log.i(TAG, "Возвращаем список альбомов из AsyncTask для $mArtistName")
CommonUtilities.albumListInstance = result;
}
}
我想在这里调用我的方法:
val runAllTasks = object : AsyncTask<Void,Void,Void>(){
override fun doInBackground(vararg p0: Void?): Void? {
getArtistDataAsync.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, name)
getSimilarBandsAsync.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, name)
getTopTracksAsync.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, name)
getTopAlbumsAsync.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, name)
return null
}
override fun onPostExecute(result: Void?) {
super.onPostExecute(result)
startActivity(Intent(applicationContext, DetailsActivity::class.java))
}
}
runAllTasks.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
Kotlin库Kovenant通过使用promise(简单地为'task {...}'),有一个非常简单的模型,然后将它们结合起来,可以创建一个复合承诺,然后可以在部分或全部完成时继续。 http://kovenant.komponents.nl/ ...并且它支持Android开箱即用,只需要一个特殊的小插件,如果你想在UI线程上自动回调。 http://kovenant.komponents.nl/addons/ui/ –
无论Java堆栈溢出的答案如何,都适用于Kotlin。因此,如果你不是在寻找类似Kotlin库的东西来替代异步任务,那么这个问题就是一个骗局。 http://stackoverflow.com/questions/17418194/multiple-callback-waiting-in-android-java和http://stackoverflow.com/questions/25608795/android-how-to-detect-when-multiple-http-请求完成和http://stackoverflow.com/questions/16504352/running-multiple-services-at-one-time-in-android ...和其他 –
更多的标签:http://stackoverflow.com/问题/ tagged/android-asynctask –