Android:等待多个任务完成

我有4个异步任务从互联网加载数据。 在同一时间,我用动画展示活动,当任务完成时,我需要启动另一个加载数据的活动。

我在Kotlin上的异步方法(与在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) 

你可以调用一个synchronized通用方法来计算已经完成的asyncTask的数量。 像这样的东西:

 private static final int NUMBER_ASYNCTASK = 4; private static int counter = 0; public static synchronized void asyncTaskCompleted() { counter++; if(counter == NUMBER_ASYNCTASK) //start new activity } 

我将使用Kovenant库,它支持Android,很小,并使用all() , combine()或和()使这种类型的事情变得非常简单。

Kovenant是Kotlin的Promise库。 如果你正在转移到Kotlin,那么检查一下让生活更轻松的事情是一个很好的机会。 对于UI线程的回调,您可以使用UI模块 。

那么无论在Android还是后端JVM编程中,都可以使用相同的库,相同的语义,并且有一个更简单的编程模型。