Search code examples
javaandroidandroid-asynctask

Retrieving more than one string with an AsyncTask


I am using AsyncTask in conjunction with StreamScraper to get shoucast metadata for an app I am developing. Right now, I am getting only the song title, but I would also like to get the stream title (which is achieved with stream.getTitle();.) Below is my AsyncTask.

public class HarvesterAsync extends AsyncTask <String, Void, String> {

@Override
protected String doInBackground(String... params) {
    String songTitle = null;
    Scraper scraper = new ShoutCastScraper();
    List<Stream> streams = null;
    try {
        streams = scraper.scrape(new URI(params[0]));
    } catch (URISyntaxException e) {
        e.printStackTrace();
    } catch (ScrapeException e) {
        e.printStackTrace();
    }
    for (Stream stream: streams) {
        songTitle = stream.getCurrentSong();
    }
    return songTitle;
}

@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
    MainActivity.songTitle.setText(s);
}
}

What do I need to change so that I can get more than one string?


Solution

  • The simplest way to return more than one value from a background task in this case is to return an array.

    @Override
    protected String[] doInBackground(String... params) {
        String songTitle = null;
        String streamTitle = null; // new
        Scraper scraper = new ShoutCastScraper();
        List<Stream> streams = null;
        try {
            streams = scraper.scrape(new URI(params[0]));
        } catch (URISyntaxException e) {
            e.printStackTrace();
        } catch (ScrapeException e) {
            e.printStackTrace();
        }
        for (Stream stream: streams) {
            songTitle = stream.getCurrentSong();
            streamTitle = stream.getTitle(); // new. I don't know what method you call to get the stream title - this is an example.
        }
        return new String[] {songTitle, streamTitle}; // new
    }
    
    @Override
    protected void onPostExecute(String[] s) {
        super.onPostExecute(s); // this like is unnecessary, BTW
        MainActivity.songTitle.setText(s[0]);
        MainActivity.streamTitle.setText(s[1]); // new. Or whatever you want to do with the stream title.
    }