I have some problem with async tasks. I've trying to run 4 async tasks which fetching data from last.fm rest api.
My task points:
- Run 4 tasks (count doesn't matter, but must be greater than 1) asynchronously or parallel
- Fetch data from last.fm rest api (for fetching data from last.fm api i've using de.umass.lastfm java library)
- Wait for complete all tasks
- Start another activity with fetched data
Function where invokes async tasks:
<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>
Function where introduced my tasks
<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>
Stack trace:
<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>
- So how can i fix this error?
- How wait for tasks completed?
- Where need to invoke startActivity method?
I've using Kotlin, but task methods is java similar. If u can show me how I need to write my code using java will be awesome too.
Thanks