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

Android layout 从网站链接url检索图像时出现内存不足异常,android-layout,exception,memory-leaks,imageview,android-drawable,Android Layout,Exception,Memory Leaks,Imageview,Android Drawable,您好,我正在创建一个android应用程序,我的网站上有1500多张照片,我想使用阵列适配器在ListView上显示 我找到的一个解决方案是从我的URL链接下载图像。 这是stacktrace 我的问题是出现了内存不足异常 :E/AndroidRuntime1123:致命异常:线程-79 :E/AndroidRuntime1123:进程: android.quotes,PID:1123 **:E/AndroidRuntime1123:java.lang.OutOfMemoryError:E/An

您好,我正在创建一个android应用程序,我的网站上有1500多张照片,我想使用阵列适配器在ListView上显示 我找到的一个解决方案是从我的URL链接下载图像。 这是stacktrace

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

:E/AndroidRuntime1123:致命异常:线程-79 :E/AndroidRuntime1123:进程: android.quotes,PID:1123 **:E/AndroidRuntime1123:java.lang.OutOfMemoryError:E/AndroidRuntime1123: 在**android.graphics.BitmapFactory.NativeDecodesTeamNative方法中 :E/AndroidRuntime1123:at android.graphics.BitmapFactory.decodeStreamInternalBitmapFactory.java:613 :E/AndroidRuntime1123:at android.graphics.BitmapFactory.decodeStreamBitmapFactory.java:589 :E/AndroidRuntime1123:at android.graphics.BitmapFactory.decodeResourceStreamBitmapFactory.java:422 :E/AndroidRuntime1123:at android.graphics.drawable.drawable.createFromResourceStreamDrawable.java:840 :E/AndroidRuntime1123:at android.graphics.drawable.drawable.createFromStreamDrawable.java:791 :E/AndroidRuntime1123:at com.c.fragments.AuthorImageFragment.loadImageFromWebOperationsAuthorImageFragment.java:77 :E/AndroidRuntime1123:at com.c.fragments.AuthorImageFragment.access$0AuthorImageFragment.java:72 :E/AndroidRuntime1123:at com.c.fragments.AuthorImageFragment$1.runAuthorImageFragment.java:109

下面是来自适配器的代码:

任何帮助都将不胜感激。。 致以最良好的祝愿:
现在,为了提供更多帮助,我将添加用于检索图像的代码

你不可能在内存中保存那么多图像。我建议您将图像下载到本地文件存储,然后在适配器中,当您想要实际绘制包含图像的项目时,您应该启动一个加载程序,该加载程序将按需从磁盘加载图像。很抱歉,内存不足,无法同时存储这么多图像

更高级的策略是使用weakreference将缓存插入到加载过程中。您可以从磁盘加载映像,并将其插入类似HashMap>的内容中,首先查看您想要的映像是否在其中,如果不在其中,则按照通常的方式从磁盘加载

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

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;
                    }
              }
              }
        }