-2

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:

  1. Run 4 tasks (count doesn't matter, but must be greater than 1) asynchronously or parallel
  2. Fetch data from last.fm rest api (for fetching data from last.fm api i've using de.umass.lastfm java library)
  3. Wait for complete all tasks
  4. 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>
  1. So how can i fix this error?
  2. How wait for tasks completed?
  3. 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

Damon Shine
  • 33
  • 2
  • 6

1 Answers1

-1

Required to paste this line to all async tasks which using last.fm library methods Caller.getInstance().cache = null

Same issue

Solution

Damon Shine
  • 33
  • 2
  • 6