使用AsyncTask在后台加载位图

时间:2017-04-04 10:52:16

标签: android bitmap android-asynctask

Hello Devs我是新来的,我真的想要一个帮助或建议我创建音乐应用程序和我在列表视图中的专辑artWork的歌曲,但它加载非常慢我想使用asyncTask加载位图感谢任何帮助.....

这是我的代码

public class SongFragment extends Fragment {


private Context context;
private SongsAdapter songAdt;
private ListView songView;
private ArrayList<Songs> songsList;
//Binder
private boolean musicBound = false;
//Service
private MusicService musicSrv;
private Intent playIntent;
//activity and playback pause flags
private boolean playbackPaused = false;
//connect to the service
private ServiceConnection musicConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        MusicService.MusicBinder binder = (com.example.android.materialmusic.MusicService.MusicBinder) service;
        //get service
        musicSrv = binder.getService();
        //pass list
        musicSrv.setList(songsList);
        musicBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        musicBound = false;
    }
};

public SongFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(final LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_song, container, false);

    songView = (ListView) rootView.findViewById(R.id.songs);
    //instantiate list
    songsList = new ArrayList<>();
    //get songs from device
    getSongList();
    //sort alphabetically by title
    Collections.sort(songsList, new Comparator<Songs>() {
        public int compare(Songs a, Songs b) {
            return a.getTitle().compareTo(b.getTitle());
        }
    });

    //create and set adapter
    songAdt = new SongsAdapter(getActivity(), songsList);
    songView.setAdapter(songAdt);

    songView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            musicSrv.setSong(Integer.parseInt(view.getTag().toString()));
            musicSrv.playSong();
            if (playbackPaused) {
                playbackPaused = false;
            }
        }
    });
    return rootView;
}

//start and bind the service when the activity starts
@Override
public void onStart() {
    super.onStart();
    if (playIntent == null) {
        playIntent = new Intent(getActivity(), MusicService.class);
        this.getActivity().bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE);
        this.getActivity().startService(playIntent);
    }
}

//method to retrieve song_item info from device
public void getSongList() {
    //query external audio
    ContentResolver musicResolver = getActivity().getContentResolver();
    Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    @SuppressLint("Recycle")
    Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);

    if (musicCursor != null && musicCursor.moveToFirst()) {
        //get columns
        int titleColumn = musicCursor.getColumnIndex
                (MediaStore.Audio.Media.TITLE);
        int idColumn = musicCursor.getColumnIndex
                (MediaStore.Audio.Media._ID);
        int artistColumn = musicCursor.getColumnIndex
                (MediaStore.Audio.Media.ARTIST);
        int albumColumn = musicCursor.getColumnIndexOrThrow
                (MediaStore.Audio.Media.ALBUM_ID);
        //add songs to list
        do {
            long thisId = musicCursor.getLong(idColumn);
            String thisTitle = musicCursor.getString(titleColumn);
            String thisArtist = musicCursor.getString(artistColumn);

            long thisAlbum = musicCursor.getLong(albumColumn);
            Uri sArtworkUri = Uri
                    .parse("content://media/external/audio/albumart");
            Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, thisAlbum);

            Bitmap artWork = null;
            try {
                artWork = MediaStore.Images.Media.getBitmap(
                        musicResolver, albumArtUri);
                artWork = Bitmap.createScaledBitmap(artWork, 150, 150, true);

            } catch (FileNotFoundException exception) {
                exception.printStackTrace();
                artWork = BitmapFactory.decodeResource(getResources(),
                        R.drawable.no_cover);
            } catch (IOException e) {
                e.printStackTrace();
            }

            songsList.add(new Songs(thisId, thisTitle, thisArtist, artWork));
        }
        while (musicCursor.moveToNext());
    }
}

private class LoadingBitmap extends AsyncTask<Void, Void, Bitmap> {

    @Override
    protected Bitmap doInBackground(Void... params) {
        return bitmap;
    }
}

}

3 个答案:

答案 0 :(得分:0)

我建议您使用Glide作为目的,它提供了您当前需要的所有工具,例如获取图像以及调整大小和缓存。

最好的是你自己阅读,否则我需要实施整个解决方案。

答案 1 :(得分:0)

您可以在代码中使用Glide library

ImageView imageView = (ImageView) findViewById(R.id.my_image_view);
Glide.with(this).load("your image url").into(imageView);

使用简单方便,有助于在您的应用中更好地运行。

答案 2 :(得分:0)

我找到了获得专辑封面的最佳方法

        Glide.with(mContext)
            .load(getAlbumArtUri(song.getArtWork()))
            .placeholder(R.drawable.no_cover)
            .override(120,120)
            .into(holder.albumArt);

private static Uri getAlbumArtUri(long albumId) {
  return ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"), albumId);
}