安卓:等待多个任务完成 [英] Android: Wait for multiple tasks complete
本文介绍了安卓:等待多个任务完成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我从互联网4异步任务,其中加载数据。在同一时间,我展示动画,活动时完成任务,我需要开始另一个activty与加载的数据。
这是我的科特林异步方法(同写在Java的异步任务)
私人乐趣getArtistData(名称:字符串){
VAL getArtistDataAsync =对象:AsyncTask的<弦乐,太虚,艺术家>(){ 覆盖乐趣doInBackground(可变参数ARGS:字符串):艺术家? {
Log.i(TAGПолучаемданныевAsyncTask的для$ mArtistName)
Caller.getInstance()。缓存= NULL
返回Artist.getInfo(参数[0],26cc2ebf6da38bc646733f661bfc6268);
} 覆盖乐趣onPostExecute(结果:艺术家){
super.onPostExecute(结果)
Log.i(TAGВозвращаемданныеиз的AsyncTaskдля$ mArtistName)
CommonUtilities.artistInstance =结果为艺术家;
}
} VAL getTopTracksAsync =对象:AsyncTask的<弦乐,无效的ArrayList<轨道>>(){
覆盖乐趣doInBackground(可变参数ARGS:字符串):ArrayList的<轨道&GT ;? {
Log.i(TAGПолучаемсписокпесенвAsyncTask的для$ mArtistName)
Caller.getInstance()。缓存= NULL
返回Artist.getTopTracks(参数[0],26cc2ebf6da38bc646733f661bfc6268)作为ArrayList的<轨道取代;
} 覆盖乐趣onPostExecute(结果:ArrayList的<轨道>?){
super.onPostExecute(结果)
Log.i(TAGВозвращаемсписокпесениз的AsyncTaskдля$ mArtistName)
CommonUtilities.trackListInstance =结果;
}
} VAL getSimilarBandsAsync =对象:AsyncTask的<弦乐,无效的ArrayList<艺术家>>(){
覆盖乐趣doInBackground(可变参数ARGS:字符串):ArrayList的<艺术家&GT ;? {
Log.i(TAGПолучаемсписокпохожихгруппвAsyncTask的для$ mArtistName)
Caller.getInstance()。缓存= NULL
返回Artist.getSimilar(参数[0],26cc2ebf6da38bc646733f661bfc6268)作为ArrayList的<艺术家&GT ;?
} 覆盖乐趣onPostExecute(结果:ArrayList的<艺术家>?){
super.onPostExecute(结果)
Log.i(TAGВозвращаемсписокпохожихгруппиз的AsyncTaskдля$ mArtistName)
CommonUtilities.artistListInstance =结果;
}
} VAL getTopAlbumsAsync =对象:AsyncTask的<弦乐,无效的ArrayList<相册和GT;>(){
覆盖乐趣doInBackground(可变参数P0:字符串):ArrayList的<相册和GT ;? {
Log.i(TAGПолучаемсписокальбомоввAsyncTask的для$ mArtistName)
Caller.getInstance()。缓存= NULL
返回Artist.getTopAlbums(P0 [0],26cc2ebf6da38bc646733f661bfc6268)作为ArrayList的<相册和GT;?;
} 覆盖乐趣onPostExecute(结果:ArrayList的<相册和GT ;?){
super.onPostExecute(结果)
Log.i(TAGВозвращаемсписокальбомовиз的AsyncTaskдля$ mArtistName)
CommonUtilities.albumListInstance =结果;
}
}
我想在这里引用我的方法:
VAL runAllTasks =对象:AsyncTask的<太虚,太虚,太虚>(){
覆盖乐趣doInBackground(可变参数P0:无效?):无效? {
getArtistDataAsync.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR,名)
getSimilarBandsAsync.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR,名)
getTopTracksAsync.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR,名)
getTopAlbumsAsync.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR,名)
返回NULL
} 覆盖乐趣onPostExecute(结果是:空虚吗?){
super.onPostExecute(结果) startActivity(意向(ApplicationContext一DetailsActivity :: class.java))
}
} runAllTasks.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
解决方案
您可以调用的计数的AsyncTask <数的
同步
常用的方法/ code>已经完成。事情是这样的:
私有静态最终诠释NUMBER_ASYNCTASK = 4;
私有静态诠释柜台= 0;公共静态同步无效asyncTaskCompleted(){
反++;
如果(反== NUMBER_ASYNCTASK)
//启动新的活动
}
I have 4 async tasks which load data from internet. In same time I show activity with animation, when tasks complete I need to start another activty with loaded data.
My async methods on Kotlin (same as async tasks written on 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;
}
}
I trying to invoke my methods here:
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)
解决方案
You can call a synchronized
common method which count the number of asyncTask
that already finished. Something like this:
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
}
这篇关于安卓:等待多个任务完成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文