开发音乐播放器时遇LoaderCallbacks未重写方法及Loader<Cursor>错误,如何解决?
解决音乐播放器中LoaderCallbacks编译错误及Support Library Loader类型不匹配问题
嘿,我帮你梳理下遇到的这两个问题,本质都是Support库与原生Android API的Loader类混用,再加上代码里重复实现回调方法导致的:
错误原因拆解
- 第一个编译错误:你重复写了
onLoadFinished和onLoaderReset方法,其中一组用的是原生Loader<Cursor>,另一组用的是Support库的android.support.v4.content.Loader<Cursor>,这让编译器判定你没有正确实现LoaderManager.LoaderCallbacks<Cursor>接口的所有抽象方法——接口要求方法参数类型必须完全统一。 - 第二个Loader
错误:使用 getSupportLoaderManager()时,必须全程使用Support库的Loader相关类,原生Loader和Support库的Loader是完全不同的类,混用必然导致类型不兼容。
修正后的代码
删除重复的回调方法,统一使用Support库的Loader类,修正后的代码如下:
private void getAudioListFromMediaDatabase() { getSupportLoaderManager().initLoader(LOADER_ID, null, new android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>() { @Override public android.support.v4.content.Loader<Cursor> onCreateLoader(int id, Bundle args) { Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; String[] projection = new String[]{ MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.DATA }; String selection = MediaStore.Audio.Media.IS_MUSIC + " = 1"; String sortOrder = MediaStore.Audio.Media.TITLE + " COLLATE LOCALIZED ASC"; // 务必使用Support库的CursorLoader return new android.support.v4.content.CursorLoader(getApplicationContext(), uri, projection, selection, null, sortOrder); } @Override public void onLoadFinished(android.support.v4.content.Loader<Cursor> loader, Cursor data) { mAdapter.swapCursor(data); } @Override public void onLoaderReset(android.support.v4.content.Loader<Cursor> loader) { mAdapter.swapCursor(null); } }); }
额外注意事项
- 检查你的导入语句,确保所有Loader相关类都来自
android.support.v4.content或android.support.v4.app包,不要导入原生的android.content.Loader或android.app.LoaderManager。 - 如果项目已经迁移到AndroidX,对应的包要换成
androidx.loader.content和androidx.loader.app,替换旧的Support库包即可。
内容的提问来源于stack exchange,提问作者dd hold
相关产品推荐
相关产品推荐

