【问题标题】:Performance issue while fetching Audio获取音频时的性能问题
【发布时间】:2018-04-13 17:52:49
【问题描述】:

我正在使用以下代码在 android 中获取设备的音频数据

public void getSongList()
{
    MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
    ContentResolver contentResolver = getActivity().getContentResolver();
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    Cursor cursor = contentResolver.query(uri,null,null,null,null);
    if(cursor!=null && cursor.moveToFirst())
    {
        do {
            mediaMetadataRetriever.setDataSource(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)));
            long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID));
            String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
            String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
            Bitmap image = null;
            try
            {
                byte[] art = mediaMetadataRetriever.getEmbeddedPicture();
                BitmapFactory.Options opt = new BitmapFactory.Options();
                opt.inSampleSize = 2;
                image = BitmapFactory.decodeByteArray(art, 0, art.length, opt);
            }catch(Exception e){}
            mSongModel.add(new SongModel(id,title,artist,image));
        }while(cursor.moveToNext());
    }
}

问题是,它显着影响了启动时间。

因此,我们将不胜感激任何有关性能改进的建议。 或者,我应该为此使用异步任务吗?

谢谢。

【问题讨论】:

    标签: android performance audio android-contentresolver mediastore


    【解决方案1】:

    我猜您正在使用 metamediaDataRetriever 从曲目本身而不是从媒体数据库中获取专辑封面。在我的应用 New Playlist Manager 中,我根本不使用 metamediaDataRetriever,而是使用 Glide 库获取专辑封面

                      //  loading album cover using Glide library
                String stralbumId = c.getString(c
                        .getColumnIndex(MediaStore.Audio.Playlists.Members.ALBUM_ID));
                Uri ImageUrl = getAlbumUri(mContext, stralbumId);
                if (ImageUrl != null) {
                    Glide.with(mContext)
                            .asBitmap()
                            .load(ImageUrl)
                            .into(image);
                }
    

       public Uri getAlbumUri(Context mContext,String album_id){
        Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
        Uri imageUri = Uri.withAppendedPath(sArtworkUri, String.valueOf(album_id));
        return imageUri;
    
    }
    

    不再处理字节或内存不足错误等。它完成了所有繁重的工作。

    在您的应用模块的 build.gradle 中添加:

       implementation 'com.github.bumptech.glide:glide:4.5.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.5.0'
    

    【讨论】:

    • 非常感谢您的回答
    • 那么是否需要使用异步来检索光标数据?!
    • 我使用异步任务来填充我的音乐元素。将上述内容放在bindItem(cursor c)中的RecyclerViewCursorAdapter中
    • 为了更清楚一点,是的,您应该使用 asyncTask 来获取光标。数据的呈现发生在您将光标传递到的适配器中,如下面的答案所示。看看blogc.at/2015/10/13/…
    【解决方案2】:

    例如

         @Override
    public Loader<Cursor> onCreateLoader(int loaderID, Bundle bundle) {
        switch (loaderID) {
            case LOADER:
    
                return new CursorLoader(getActivity(),
                        MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                        dataColumns,
                        selection, selectionArgs,
                        sort_order);
            default:
                return null;
        }
    }
    
    
    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
    
    
        mAdapter = new new_showallTracksAdapter(new_showallTracksFragment.this.getActivity(),c, listener);
        mRecyclerView.setAdapter(mAdapter);
        mAdapter.swapCursor(c);
        mAdapter.setLayout(currentlayout);
    }
    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        mAdapter.swapCursor(null);
    
    }
    

    【讨论】:

    • 非常感谢您的解释。现在一切都清楚了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多