Android:运行4个异步任务(与Rest API一起工作),完成所有任务后等待并启动另一个任务
我有一些异步任务的问题。 我试图运行从last.fm休息API获取数据的4个异步任务。
我的任务是:
- 运行4个任务(计数无关紧要,但必须大于1)异步或并行
- 从last.fm rest api获取数据(用于从last.fm api获取数据,我使用了de.umass.lastfm java库)
- 等待完成所有任务
- 用获取的数据开始另一个活动
调用异步任务的函数:
<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>
- 那我该如何解决这个错误?
- 如何等待任务完成?
- 哪里需要调用startActivity方法?
我已经使用Kotlin,但是任务方法与java类似。 如果你能告诉我如何使用java编写我的代码,那也是非常棒的。
谢谢
将此行粘贴到使用last.fm库方法的所有异步任务需要Caller.getInstance().cache = null
同样的问题
解