【发布时间】:2015-06-25 15:50:27
【问题描述】:
我实际上在一个 Android 应用程序中工作,需要从网络下载 PNG 并将其显示在 recyclerView 中。下载部分与内部存储中的保存相同。问题出在显示器上,当我在我的 onBindViewHolder 中的 AsyncTask 中加载它时,这不是流畅的.....并且在 AVD 上我有一个异常,比如资源未关闭。所以我将粘贴适配器:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
private static final String TAG = "MyAdapter";
private List<Item> listItem = null;
public MyAdapter(List<Item> listItem) {
this.listItem = listItem;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Log.d(logTag, "view group " + parent);
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_row, parent, false);
return new MyViewHolder(v);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
//Log.d(logTag, " bind " + position + " holder " + holder);
final Item item = listItem.get(position);
holder.position = position;
//new LoadBitmap(position, holder).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, item.getId());
}
private class LoadBitmap extends AsyncTask<String, Void, Bitmap> {
private MyViewHolder holder = null;
private int position = 0;
public LoadBitmap(int position, MyViewHolder holder) {
this.holder = holder;
this.position = position;
}
@Override
protected Bitmap doInBackground(String... params) {
File file = new File("/data/data/myapp/files", params[0]);
FileInputStream fis = null;
Bitmap bitmap = null;
try {
fis = new FileInputStream(file);
bitmap = BitmapFactory.decodeStream(fis);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null && holder.position == position) {
holder.imageView.setImageBitmap(bitmap);
}
}
}
@Override
public int getItemCount() {
return listItem.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private ImageView imageView = null;
int position = 0;
public MyViewHolder(View itemView) {
super(itemView);
imageView = (ImageView) itemView.findViewById(R.id.imageView_item);
}
}
}
我也尝试使用 UI 线程:
holder.imageView.post(new Runnable() {
@Override
public void run() {
File file = new File("/data/data/myapp/files", item.getId());
FileInputStream fis = null;
Bitmap bitmap = null;
try {
fis = new FileInputStream(file);
bitmap = BitmapFactory.decodeStream(fis);
holder.imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
});
我希望它足够清楚,对不起我的英语。 谢谢。
编辑: 此修复工作完美
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
Item item = listItem.get(position);
holder.position = position;
File file = new File("/data/data/myApp/files", item.getId());
Picasso.with(holder.itemView.getContext()).load(file).resize(50,25).centerCrop().into(holder.imageView);
}
【问题讨论】:
-
坏主意(即使是中级)....使用一些库....所有这些回收都不是那么容易(取消上一个请求)
标签: android bitmap android-asynctask adapter android-recyclerview