我有一个很大的对象列表,所有人都有自己的图像路径“ex。http://www.google.com/image.jpg”,我需要下载图像并将drawable保存到对象中。
我正在使用AsyncTask,但即使我使用自己的线程,我总是在列表中的某个任意点处得到'OutOfMemoryError'。这些图像的大小永远不会超过82Kb(这对Android平板电脑来说太大了吗?),但我认为图像的绝对数量导致整个过程失败。
这是我目前正在做的事情。
class DownloadImageTask extends AsyncTask<ArrayList<Item>, Void, Void> {
private static int num =1;
@Override
protected Void doInBackground(ArrayList<Item>... items) {
try {
if(items.length == 0)
return null;
HttpURLConnection connection;
InputStream input;
for(ArrayList<Item> itemlist : items) {
for(Item i : itemlist) {
Log.d(JusTouchMenu.TAG,"[Item]Image request to url:"+i.getImagePath());
try {
connection = (HttpURLConnection)new URL(i.getImagePath()).openConnection();
connection.setRequestProperty("User-agent","Mozilla/4.0");
connection.connect();
input = connection.getInputStream();
i.setImage(new BitmapDrawable(BitmapFactory.decodeStream(input)));//Requires a drawable
connection.disconnect();
} catch(Exception e) {Log.e(JusTouchMenu.TAG,"[Item]Unable to download image @ '"+i.getImagePath()+"'",e);}
Log.v(JusTouchMenu.TAG, "[Item]Image decoded @ '"+i.getImagePath()+"' #"+num++);
for(Tag pt : i.tags()) {
Log.d(JusTouchMenu.TAG,"[Item->Tag]Image request to url:"+pt.getImagePath());
try {
connection = (HttpURLConnection)new URL(pt.getImagePath()).openConnection();
connection.setRequestProperty("User-agent","Mozilla/4.0");
connection.connect();
input = connection.getInputStream();
pt.setImage(new BitmapDrawable(BitmapFactory.decodeStream(input))); //Requires a drawable
connection.disconnect();
} catch(Exception e) {
Log.e(JusTouchMenu.TAG,"[Item->Tag]Unable to download image @ '"+i.getImagePath()+"'",e);
}
Log.v(JusTouchMenu.TAG, "[Item->Tag]Image decoded @ '"+pt.getImagePath()+"' #"+num++);
}
}
}
} catch(Exception e) {
Log.e(JusTouchMenu.TAG,"Error decoding image inside AsyncTask",e);
}
return null;
}
谢谢!
答案 0 :(得分:0)
您想要立刻获得多少这些图片?你是怎么用它们的?
您应该考虑使用Gallery或GridView的功能,从而只加载目前处于视图中的图像。你甚至可以得到它们的想象力并缓存它们,因此滚动很顺畅。当你不可能一次性显示所有图像时,尝试将所有图像加载到ArrayList中并不是一种移动友好的方法。
以下是对缓存方法的一些不错的参考,但您可能应该根据需要开始使用基本库或网格视图加载,然后添加缓存。