您好我正在创建一个Android应用程序,我在我的网站上有超过1500张照片,我希望使用数组适配器在ListView上显示 我找到的一个解决方案是从我拥有的URL链接下载图像。 这是stacktrace
我的问题是我的内存异常
:E / AndroidRuntime(1123):FATAL EXCEPTION:Thread-79 :E / AndroidRuntime(1123):流程: android.quotations,PID:1123 **:E / AndroidRuntime(1123): java.lang.OutOfMemoryError :E / AndroidRuntime(1123): at ** android.graphics.BitmapFactory.nativeDecodeStream(Native Method) :E / AndroidRuntime(1123):at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:613) :E / AndroidRuntime(1123):at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:589) :E / AndroidRuntime(1123):at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:422) :E / AndroidRuntime(1123):at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840) :E / AndroidRuntime(1123):at android.graphics.drawable.Drawable.createFromStream(Drawable.java:791) :E / AndroidRuntime(1123):at com.c.fragments.AuthorImageFragment.loadImageFromWebOperations(AuthorImageFragment.java:77) :E / AndroidRuntime(1123):at com.c.fragments.AuthorImageFragment.access $ 0(AuthorImageFragment.java:72) :E / AndroidRuntime(1123):at com.c.fragments.AuthorImageFragment $ 1.run(AuthorImageFragment.java:109)
,以下是适配器的代码:
private ImageView imageDetail(View v, int resId, Drawable drawable) {
ImageView value = (ImageView) v.findViewById(resId);
BitmapDrawable draw = (BitmapDrawable)drawable;
// value.setAdjustViewBounds(true);
Bitmap bmp=draw.getBitmap();
// value.setLayoutParams(new android.widget.TableRow.LayoutParams((width/4), (height/4)));
value.setImageBitmap(bmp);
return value;
}
Thread networkThread = new Thread() {
@Override
public void run() {
Author author;
// This is just a test i want to do :)))
for (int i=0;i<=1000;i++){
author=new Author();
try {
author.setAuthorImage(loadImageFromWebOperations("http://mySite/Directory/images/"+5+".jpg",i));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
list.add(author);
}
getActivity().runOnUiThread (new Runnable(){
public void run() {
adapter= new AuthorImageAdapter(getActivity().getApplicationContext(),list);
}
});
}
}; networkThread.start();
****这是我用来检索图像的方法****
private Drawable loadImageFromWebOperations(String url,int id) throws MalformedURLException, IOException
{ InputStream is=null;
try{
is = (InputStream) new java.net.URL(url).getContent();
LOGGER.info("Drawable -----");
Drawable d = Drawable.createFromStream(is, id+".jpg");
return d;
}catch (Exception e) {
// log Exception
LOGGER.info("Exception "+e.toString());
return null;
}
finally {
if (is!=null){
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
LOGGER.info("Exception "+e.toString());
// log Exception
return null;
}
}
}
}
任何帮助将不胜感激.. 最好的祝福 :))) 现在为了帮助更多,我将添加用于检索图像的代码。
答案 0 :(得分:0)
你无法在内存中保存那么多图像。我建议你将图像下载到本地文件存储,然后在你想要实际绘制具有图像的项目的适配器中,你应该启动一个Loader,它将按需从磁盘加载图像。抱歉,目前还没有足够的内存来存储那么多图像。
更高级的策略是使用WeakReferences将缓存插入到加载过程中。您从磁盘加载图像并插入类似HashMap&gt;的东西;并查看您想要的图像是否首先存在,如果没有,则按照通常的方式从磁盘加载。
如果你想在架构上真正想要发生的事情是我上面列出的WeakReference缓存,请尝试从磁盘加载,但如果文件不存在于磁盘上,则从网络加载。然后,在最终访问网络之前,这将成为一个双层缓存,然后是磁盘。