Search code examples
androidandroid-music-player

How to use managedQuery from an asyncTask


I am trying to make an Android music player. To make things easier, I have decided to copy the Artists on the phone to a local DB and then make some custom queries to the local data. I know how to copy the managedQuery to a db, but cannot do so on an AsyncTask since managedQuery is only accessible by an Activity class. I am trying to do this call in my Application class upon app startup. Does anyone know a way to call managedQuery inside of the AsyncTask? I really do not want to do this in my first activity that is called since it will slow my load speed significantly.

This is what I would like to do, although I know this will not compile...

public class AplayApplication extends Application implements
    OnSharedPreferenceChangeListener {

private static final String TAG = AplayApplication.class.getSimpleName();
private SharedPreferences prefs;
protected MusicData musicData;
protected PlayerHandler mMediaPlayer;
protected boolean isPlaying;
private boolean prefUseDefaultShuffle;
private boolean prefUseSmartShuffle;
private int prefArtistSkipDuration;
private int prefUnheardArtistPct;
protected TabHost tabHost;
protected Song currentSong;
protected int currentSongPosition;
private static final String PREFERENCE_KEY = "seekBarPreference";
protected boolean hasLoadedSongs;
private static AplayApplication aplayapp;

@Override
public void onCreate() {
    super.onCreate();
    prefs = PreferenceManager.getDefaultSharedPreferences(this);
    prefs.registerOnSharedPreferenceChangeListener(this);
    setPrefs();
    Log.i(TAG, "Application started");
    mMediaPlayer = new PlayerHandler();

    // code in question below this line 

    musicData = new MusicData(this);   // this creates instance of database helper to access db
    // will call execute on async task here.  
    // new getArtist().execute();

}

private class getArtists extends AsyncTask<Void, Void, Boolean>{
    Cursor artCursor;
    @Override
    protected Boolean doInBackground(Void... params) {
        String[] proj = { 
                MediaStore.Audio.Artists._ID,MediaStore.Audio.Artists.ARTIST, 
                 };

        artCursor = managedQuery(
                MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, proj, null,
                    null, MediaStore.Audio.Artists.ARTIST + " ASC");

        ContentValues values = new ContentValues();
        artCursor.moveToPosition(-1);
        while (artCursor.moveToNext()) {
            values.put(
                    MusicData.S_DISPLAY,
                    newMusicCursor.getString(newMusicCursor
                            .getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)));
            values.put(MusicData.S_ARTIST, newMusicCursor
                    .getString(newMusicCursor
                            .getColumnIndex(MediaStore.Audio.Media.ARTIST)));
            values.put(MusicData.S_FILE, newMusicCursor
                    .getString(newMusicCursor
                            .getColumnIndex(MediaStore.Audio.Media.DATA)));
            this.musicData.insertMastSong(values);
        }

        return true;
    }


//// code continues.....

Solution

  • As Sparky says, you could use CursorLoader instead of managedQuery.

    If you are developing for sdk 8 you need to add Support Package to your project.

    To avoid delay your application start maybe you could use a Service.

    This is a little example for use a service, get the data from an url and then insert it to the database

    public class GetArticlesService extends IntentService {
        private static final String TAG = "GetArticlesService";
        public GetArticlesService() {
            super("GetdArticlesService");
        }
    
        /* (non-Javadoc)
         * @see android.app.IntentService#onHandleIntent(android.content.Intent)
         */
        @Override
        protected void onHandleIntent(Intent intent) {
            String url = "http://example.com/artists.json";
            String response = null;
    
    
    
            try {
                response = Utils.httpPost(getApplicationContext(), url + "/api/GetArticles", null);
    
            } catch (HttpHostConnectException e) {
                e.printStackTrace();
    
            }
    
            if(!TextUtils.isEmpty(response)){
                try {
                    JSONArray list = new JSONArray(response);
                    if(list.length() > 0){
                        ContentValues toInsert = new ContentValues[];
                        JSONObject art = null;
                        int cant = list.length();
                        for(int i = 0;i< cant; i++){
                            toInsert.clear();
                            art = list.getJSONObject(i);
                            toInsert = new ContentValues();
                            toInsert.put(Articles._ID, art.getInt("id"));
                            toInsert.put(Articles.DESCRIPTION, art.getString("description"));
                            toInsert.put(Articles.BARCODE, art.getString("barcode"));
                            toInsert.put(Articles.RUBRO, art.getString("rubro"));
                            toInsert.put(Articles.CLAVE, art.getString("clave"));
                            getContentResolver().inert(Articles.CONTENT_URI, toInsert);
                        }
    
                    }
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
        }
    }