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

我有一些异步任务的问题。 我试图运行从last.fm休息API获取数据的4个异步任务。

我的任务是:

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

调用异步任务的函数:

<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$3.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$1.doInBackground(AnimationActivity.kt:120) at pw.osin.musicexpert.activities.AnimationActivity$getArtistData$getSimilarBandsAsync$1.doInBackground(AnimationActivity.kt:117) at android.os.AsyncTask$2.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

同样的问题