2011-07-26 177 views
-1

我一直在收到这些错误,同时在这里检索图片。Android内存不足错误?

07-26 17:21:29.194: ERROR/AndroidRuntime(396): java.lang.RuntimeException: An error occured while executing doInBackground() 
07-26 17:21:29.194: ERROR/AndroidRuntime(396):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
    07-26 17:21:29.194: ERROR/AndroidRuntime(396):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
    07-26 17:21:29.194: ERROR/AndroidRuntime(396):  at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
    07-26 17:21:29.194: ERROR/AndroidRuntime(396):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
     07-26 17:21:29.194: ERROR/AndroidRuntime(396):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
     07-26 17:21:29.194: ERROR/AndroidRuntime(396):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
    07-26 17:21:29.194: ERROR/AndroidRuntime(396):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
     07-26 17:21:29.194: ERROR/AndroidRuntime(396):  at java.lang.Thread.run(Thread.java:1019) 
    07-26 17:21:29.194: ERROR/AndroidRuntime(396): Caused by: java.lang.OutOfMemoryError 

它发生在这里,当我尝试用此代码检索图像。

公共无效getImages()抛出IOException异常{

DefaultHttpClient httpclient = new DefaultHttpClient(); 

    HttpGet httppost = new HttpGet("https://sites.google.com/site/theitrangers/images/webImages.txt"); 
    HttpResponse response; 

     response = httpclient.execute(httppost); 


      HttpEntity ht = response.getEntity(); 

      BufferedHttpEntity buf = new BufferedHttpEntity(ht); 

      InputStream is = buf.getContent(); 


      BufferedReader r = new BufferedReader(new InputStreamReader(is)); 

      StringBuilder total = new StringBuilder(); 
      String line; 
      while ((line = r.readLine()) != null) { 
       total.append(line + "\n"); 

       imageUrl = total.toString(); 
       Log.v("getImage1", "Retreived image"); 
      } 
    } 
+0

请搜索类似的主题。有很多。 –

+0

他们不是特定于我的问题。 –

回答

1

我会说这是因为您使用它会尝试加载到内存整个响应BufferedHttpEntity。你没有尝试过吗?

InputStream is = response.getEntity().getContent(); 

然后处理它?

+0

如果我删除它,那么它会导致其他地方的语法,其中称为下面。 –

+0

你是什么意思的语法?你在其他地方使用了BufferedHttpEntity吗?我不确定你是否真的会在缓冲实体中跳过它。检查执行情况:http://goo.gl/41MEV。它会在构造函数中创建带有内容的字节数组,所以迟早会出现大图像,无论如何你都会得到OOM异常。 – mariozski

+0

哇..所以我的意思是我知道必须有一个更有效的方法来做到这一点。 –

0

我不知道您是否打算这样做,但是您将读取的文本文件中的每行URL(?)追加到StringBuffer中,然后将指定到目前为止读取的URL到imageUrl 。这意味着你基本上这样做:

imageUrl = URL1 
imageUrl = URL1, URL2 
... 
imageUrl = URL1, URL2, ... URLn 

也许这是导致内存问题。

+0

正确的做什么即时通讯...我有我的网站上的文本文件。我有应用程序获取文本文档从他们读取URL,然后将它们设置为变量...现在,使用文本文档的原因是因为URL更改,这将是我可以更新应用程序的唯一方法改变网址。 –

+0

是的,但你在做什么,你继续分配中间线,而循环缓冲区的行。因此,您分配URl1,在下一个循环中分配URL1,URL2 ...为什么不直接读入缓冲区并将其分配给最后? –

+0

你能否给我举一个我上面代码的例子,参考你的说法?或者你需要代码在哪里阅读文本文件以获取URL? –