[英]Loading bitmap in background with AsyncTask
Hello Devs i'm new here and i really wants a help or advice i created music app and i've songs in list view with album artWork but it is loading very slow i want to use asyncTask for loading bitmaps Thanks for any Help..... 您好Devs我是新来的,我真的想要一个帮助或建议,我创建了音乐应用,并且在列表视图中使用专辑artWork播放了歌曲,但加载速度很慢,我想使用asyncTask加载位图,感谢您的帮助。 ...
here is my code 这是我的代码
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;
}
}
}
I would suggest using Glide for your purpose, it offers all the tools you currently need, such as fetching the Image and also resizing it for instance and caching. 我建议您将Glide用于您的目的,它提供了您当前需要的所有工具,例如获取Image以及调整其大小以进行实例化和缓存。
Best is that you read it for yourself, otherwise I would need to implement entire solution. 最好的办法是您自己阅读,否则我将需要实施整个解决方案。
You can use Glide library like this in your code: 您可以在代码中像这样使用Glide库 :
ImageView imageView = (ImageView) findViewById(R.id.my_image_view);
Glide.with(this).load("your image url").into(imageView);
Its easy and convenient to use and will help perform better in your app. 它简单易用,将有助于在您的应用程序中表现更好。
i found best method to get album art 我找到了获得专辑插图的最佳方法
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.