Android:运行 4 个异步任务(与 Rest API 一起工作),等待并在完成所有任务后启动另一个 activity

Android: Run 4 async tasks (which works with Rest API), wait and start another activity after complete all tasks

我在处理异步任务时遇到了一些问题。我正在尝试 运行 4 个从 last.fm rest api.

获取数据的异步任务

我的任务点数:

  1. 运行 4 个任务(计数无关紧要,但必须大于 1)异步或并行
  2. Fetch data from last.fm rest api(为了从 last.fm api 获取数据,我使用了 de.umass.lastfm java 库)
  3. 等待完成所有任务
  4. 使用获取的数据启动另一个 activity

调用异步任务的函数:

<pre>override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_animation)

        initViewElements();
        mArtistName = intent.getStringExtra("ARTIST_NAME");
        Log.i(TAG, mArtistName);
        setAnimationData();

        getArtistData(mArtistName);

        startActivity(Intent(this, DetailsActivity::class.java))

    }</pre>

介绍我任务的函数

    <pre>
private fun getArtistData(name: String) {
        val getArtistDataAsync = object : AsyncTask<String, Void, Artist>() {

            override fun doInBackground(vararg args: String?): Artist? {

                return Artist.getInfo(args[0], "26cc2ebf6da38bc646733f661bfc6268");
            }

            override fun onPostExecute(result: Artist?) {
                super.onPostExecute(result)

                CommonUtilities.artistInstance = result as Artist;
            }
        }

        val getTopTracksAsync = object : AsyncTask<String,Void,ArrayList<Track>>(){
            override fun doInBackground(vararg args: String?): ArrayList<Track>? {

                return Artist.getTopTracks(args[0], "26cc2ebf6da38bc646733f661bfc6268") as ArrayList<Track>;
            }

            override fun onPostExecute(result: ArrayList<Track>?) {
                super.onPostExecute(result)

                CommonUtilities.trackListInstance = result;
            }
        }

        val getSimilarBandsAsync = object : AsyncTask<String,Void,ArrayList<Artist>>(){
            override fun doInBackground(vararg args: String?): ArrayList<Artist>? {

                return Artist.getSimilar(args[0], "26cc2ebf6da38bc646733f661bfc6268") as ArrayList<Artist>?
            }

            override fun onPostExecute(result: ArrayList<Artist>?) {
                super.onPostExecute(result)

                CommonUtilities.artistListInstance = result; //Instance Messenger Pattern


            }
        }

        val getTopAlbumsAsync = object : AsyncTask<String,Void, ArrayList<Album>>(){
            override fun doInBackground(vararg p0: String?): ArrayList<Album>? {

                return Artist.getTopAlbums(p0[0],"26cc2ebf6da38bc646733f661bfc6268") as ArrayList<Album>?;
            }

            override fun onPostExecute(result: ArrayList<Album>?) {
                super.onPostExecute(result)

                CommonUtilities.albumListInstance = result; //Instance Messenger Pattern
            }
        }

        getArtistDataAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, name)
        getSimilarBandsAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, name)
        getTopTracksAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, name)
        getTopAlbumsAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, name)

    }
</pre>

堆栈跟踪:

<pre>
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #4
                                                                     Process: pw.osin.musicexpert, PID: 17334
                                                                     java.lang.RuntimeException: An error occured while executing doInBackground()
                                                                         at android.os.AsyncTask.done(AsyncTask.java)
                                                                         at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                                                                         at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                                                                         at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                         at java.lang.Thread.run(Thread.java:841)
                                                                      Caused by: de.umass.lastfm.CallException: Caching/Reloading failed
                                                                         at de.umass.lastfm.Caller.call(Caller.java:246)
                                                                         at de.umass.lastfm.Caller.call(Caller.java:189)
                                                                         at de.umass.lastfm.Caller.call(Caller.java:185)
                                                                         at de.umass.lastfm.Artist.getSimilar(Artist.java:144)
                                                                         at de.umass.lastfm.Artist.getSimilar(Artist.java:132)
                                                                         at pw.osin.musicexpert.activities.AnimationActivity$getArtistData$getSimilarBandsAsync.doInBackground(AnimationActivity.kt:120)
                                                                         at pw.osin.musicexpert.activities.AnimationActivity$getArtistData$getSimilarBandsAsync.doInBackground(AnimationActivity.kt:117)
                                                                         at android.os.AsyncTask.call(AsyncTask.java)
                                                                         at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                                                         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                                                                         at java.lang.Thread.run(Thread.java:841) 
02-17 05:49:05.636 17334-17432/pw.osin.musicexpert W/dalvikvm: threadid=13: thread exiting with uncaught exception (group=0x4179ed58)
</pre>
  1. 那么我该如何解决这个错误呢?
  2. 如何等待任务完成?
  3. 哪里需要调用startActivity方法?

我使用的是 Kotlin,但任务方法 java 相似。如果你能告诉我如何使用 java 编写代码,那也很棒。

谢谢

需要将此行粘贴到所有使用 last.fm 库方法的异步任务 Caller.getInstance().cache = null

Same issue

Solution