【问题标题】:Out of Memory exception when retrieving Images from Website Link url从网站链接 url 检索图像时出现内存不足异常
【发布时间】:2014-10-18 00:35:34
【问题描述】:

您好,我正在创建一个 android 应用程序,我的网站上有超过 1500 张照片,我想使用 Array 适配器在 ListView 上显示 我发现的一种解决方案是从我拥有的 URL 链接下载图像。 这是堆栈跟踪

我的问题是出现内存不足异常

:E/AndroidRuntime(1123):致命异常:Thread-79 : E/AndroidRuntime(1123): 进程: android.quotations,PID:1123 ** : E/AndroidRuntime(1123): java.lang.OutOfMemoryError : E/AndroidRuntime(1123): 在** android.graphics.BitmapFactory.nativeDecodeStream(本机方法) :E/AndroidRuntime(1123):在 android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:613) :E/AndroidRuntime(1123):在 android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:589) :E/AndroidRuntime(1123):在 android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:422) :E/AndroidRuntime(1123):在 android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840) :E/AndroidRuntime(1123):在 android.graphics.drawable.Drawable.createFromStream(Drawable.java:791) :E/AndroidRuntime(1123):在 com.c.fragments.AuthorImageFragment.loadImageFromWebOperations(AuthorImageFragment.java:77) :E/AndroidRuntime(1123):在 com.c.fragments.AuthorImageFragment.access$0(AuthorImageFragment.java:72) :E/AndroidRuntime(1123):在 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;
                    }
              }
              }
        }

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

【问题讨论】:

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


    【解决方案1】:

    您无法在内存中保存这么多图像。我建议您将图像下载到本地文件存储,然后在您的适配器中,当您想要实际绘制具有图像的项目时,您应该启动一个加载器,它将按需从磁盘加载图像。抱歉,内存不足以一次存储这么多图像。

    更高级的策略是使用 Wea​​kReferences 将缓存插入到加载过程中。您从磁盘加载图像并插入到 HashMap> 之类的东西中,然后查看您想要的图像是否在其中,如果没有,然后像往常一样从磁盘加载。

    如果您想在架构上真正看中我上面列出的 WeakReference 缓存,请尝试从磁盘加载,但如果文件不存在于磁盘上,则仅从网络加载。然后,这变成了两层缓存内存,然后是磁盘,最后才进入网络。

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 2015-02-19
      • 2014-07-23
      • 1970-01-01
      • 2013-10-06
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多