Android 如何从异步任务中使用managedQuery
我正在尝试制作一个Android音乐播放器。为了简化工作,我决定将手机上的艺术家复制到本地数据库,然后对本地数据进行一些自定义查询。我知道如何将managedQuery复制到db,但无法在AsyncTask上执行此操作,因为managedQuery只能由活动类访问。我试图在应用程序启动时在我的应用程序类中执行此调用。有人知道在AsyncTask内部调用managedQuery的方法吗?我真的不想在我的第一个名为的活动中这样做,因为它会显著降低我的加载速度 这是我想做的,虽然我知道这不会编译Android 如何从异步任务中使用managedQuery,android,android-music-player,Android,Android Music Player,我正在尝试制作一个Android音乐播放器。为了简化工作,我决定将手机上的艺术家复制到本地数据库,然后对本地数据进行一些自定义查询。我知道如何将managedQuery复制到db,但无法在AsyncTask上执行此操作,因为managedQuery只能由活动类访问。我试图在应用程序启动时在我的应用程序类中执行此调用。有人知道在AsyncTask内部调用managedQuery的方法吗?我真的不想在我的第一个名为的活动中这样做,因为它会显著降低我的加载速度 这是我想做的,虽然我知道这不会编译 pu
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.....
不推荐使用。请改用CursorLoader。正如Sparky所说,您可以使用CursorLoader而不是managedQuery 如果您正在为sdk 8开发,则需要将其添加到项目中 为了避免延迟应用程序启动,您可以使用一个 这是一个使用服务的小例子,从url获取数据,然后将其插入数据库
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();
}
}
}
}
我正在API 8上开发,直到API 11I才可以使用游标加载程序。我正在通过兼容性库使用API 8上的游标加载程序。好的,谢谢。我有一个游标加载程序正在工作,但不太确定如何处理它。它运行查询,但我如何接受此查询并执行某些操作?我想把所有的美工人员都插入到一个表中。也许你需要的是一个服务,因为CursorLoader主要用于listview在后台加载数据。我添加了另一个响应来粘贴一个示例