【发布时间】:2015-12-13 19:17:24
【问题描述】:
我的问题是,我有一个 RecyclerView,在此我加载音乐专辑的专辑封面,图像加载完美,但加载是线性的,所以,当缓慢拖动 RecyclerView 时,工作正常,但是当我快速拖动 RecyclerView,加载图像需要很长时间。 我使用 AsyncTask,但我不明白为什么线程一个接一个地线性运行。
这是创建和绑定我的 ViewHolder
@Override
public AdaptadorAlbumes.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_album, parent, false);
ViewHolder vh = new ViewHolder(v, actividad);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
cursor.moveToPosition(position);
holder.imgVwPortada.setImageBitmap(Datos.getPortadaDefault());
holder.imgVwPortada.setTag(position);
holder.txtNombre.setText(cursor.getString(cursor.getColumnIndex(Constantes.ALB_NOMBRE)));
holder.txtArtista.setText(cursor.getString(cursor.getColumnIndex(Constantes.ALB_ARTISTA)));
ObtenerPortada oP = new ObtenerPortada(cursor.getInt(cursor.getColumnIndex(Constantes.ALB_ID)), holder.imgVwPortada);
oP.execute(Datos.getActividadActual());
}
这是我的 ViewHolder
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private Activity actividad;
public TextView txtNombre;
public TextView txtArtista;
public ImageView imgVwPortada;
public RelativeLayout container;
public ViewHolder(View v, Activity actividad) {
super(v);
this.actividad = actividad;
container = (RelativeLayout) itemView.findViewById(R.id.artista);
txtNombre = (TextView)v.findViewById(R.id.txtNombre);
txtArtista = (TextView)v.findViewById(R.id.txtArtista);
imgVwPortada = (ImageView)v.findViewById(R.id.imgVwPortada);
v.setOnClickListener(this);
}
}
这是我的 AsyncTask 类
private class ObtenerPortada extends AsyncTask<Activity, Void, Bitmap> {
long ID;
private ImageView imv;
private String path;
public ObtenerPortada(long ID, ImageView imv) {
this.ID = ID;
this.imv = imv;
this.path = imv.getTag().toString();
}
@Override
protected Bitmap doInBackground(Activity... params) {
WeakReference<Bitmap> bitmap = null;
try {
Uri trackUri = ContentUris.withAppendedId(Constantes.uriAlbumesArt, ID);
Bitmap bit = MediaStore.Images.Media.getBitmap(params[0].getContentResolver(), trackUri);
bitmap = new WeakReference<>(ReducirImagenes.reducirBitmap(200, 200, bit));
} catch (Exception e) {
bitmap = new WeakReference<>(Datos.getPortadaDefault());
return null;
}
return bitmap.get();
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
if (!imv.getTag().toString().equals(path)) {
return;
}
if(result != null && imv != null){
imv.setImageBitmap(result);
imv.setAlpha(0f);
imv.setVisibility(View.VISIBLE);
imv.animate().alpha(1f).setDuration(200).setListener(null);
}
}
}
这是我的问题的一个例子:https://www.youtube.com/watch?v=x_1yXh6J2Ks
【问题讨论】:
标签: android android-asynctask android-recyclerview