安卓:等待多个任务完成 [英] Android: Wait for multiple tasks complete

查看:238
本文介绍了安卓:等待多个任务完成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从互联网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 runAllTask​​s =对象: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))
        }
    }    runAllTask​​s.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)


解决方案

您可以调用的计数的AsyncTask <数的同步常用的方法/ code>已经完成。事情是这样的:

 私有静态最终诠释NUMBER_ASYNCTASK = 4;
私有静态诠释柜台= 0;公共静态同步无效asyncTaskCompleted(){
   反++;
    如果(反== NUM​​BER_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆