从网站链接URL检索图像时出现内存不足异常

时间:2014-10-17 13:54:42

标签: android-layout exception memory-leaks imageview android-drawable

您好我正在创建一个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;
                    }
              }
              }
        }

任何帮助将不胜感激.. 最好的祝福 :))) 现在为了帮助更多,我将添加用于检索图像的代码。

1 个答案:

答案 0 :(得分:0)

你无法在内存中保存那么多图像。我建议你将图像下载到本地文件存储,然后在你想要实际绘制具有图像的项目的适配器中,你应该启动一个Loader,它将按需从磁盘加载图像。抱歉,目前还没有足够的内存来存储那么多图像。

更高级的策略是使用WeakReferences将缓存插入到加载过程中。您从磁盘加载图像并插入类似HashMap&gt;的东西;并查看您想要的图像是否首先存在,如果没有,则按照通常的方式从磁盘加载。

如果你想在架构上真正想要发生的事情是我上面列出的WeakReference缓存,请尝试从磁盘加载,但如果文件不存在于磁盘上,则从网络加载。然后,在最终访问网络之前,这将成为一个双层缓存,然后是磁盘。