2013-05-10 76 views
1

我必须从服务器下载大约6000条记录到sqlite数据库。记录显示为JSON对象。使用BufferedReader检索它们时,出现内存不足的异常。我搜索了很多网站,但无法找到合适的答案。请建议一些最佳解决方案。在从android服务器下载数据时出现异常内存异常

我的代码是:

URL url = new URL("myurl"); 
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
//getting error here 
line = in.readLine(); 
System.out.println(line); 
JSONArray outerArray = (JSONArray) JSONSerializer.toJSON(line); 
System.out.println("size : " + outerArray.size()); 

我得到了这个致命的异常 -

    E/AndroidRuntime(616): java.lang.OutOfMemoryError: [memory exhausted] 
+0

任务在主线程中调用,或者您创建了'Asyn'类来在后台调用数据? – 2013-05-10 06:44:18

+0

你究竟在哪里得到这个OutOfMemoryError?你有多少内存? – 2013-05-10 06:49:24

+0

任务正在主线程中调用.. – user2368920 2013-05-10 07:47:48

回答

1

你下载文件的大小是太多的内存来容纳

尝试做这样的

// download the file 
       InputStream input = new BufferedInputStream(url.openStream()); 
       OutputStream output = new FileOutputStream(); 

       byte data[] = new byte[1024]; 
       long total = 0; 
       int count; 
       while ((count = input.read(data)) != -1) { 
        total += count; 
        // publishing the progress.... 

        output.write(data, 0, count); 
       } 

       output.flush(); 
       output.close(); 
// 

更多解释see this

此外

您应使用JSON流要么GSON或杰克逊。有了杰克逊,你也可以采用混合方式。这将显着减少你的内存消耗,因为只有被解析的json部分被加载到内存中。

https://sites.google.com/site/gson/gson-user-guide

+0

感谢您的回复..但我的错误信息是/sdcard/BarcodeScanner-debug.apk(权限被拒绝)。我是一个Android新手..你可以解释这个问题.. – user2368920 2013-05-10 07:30:54

+0

这只是一个示例代码,给一个本地文件路径,而不是 – 2013-05-10 08:07:34

+0

我越来越错误作为权限被拒绝..我必须做的? – user2368920 2013-05-10 09:40:27

0

似乎您试图下载整个JSON数组中一气呵成,并消耗大量的内存。尝试读取固定数量的缓冲块(例如:1024)中的输入,而不是执行readLine,如果这足以构建一个或多个JSON数组,则解析它。然后继续阅读下一个块。这样,你不是吹你的内存空间

请注意,此方法将只会工作,如果你能保证你的JSON数组元素将不会超过1024字节。否则,尝试相应地调整这个数/使用可调数据结构

+0

谢谢..但我有一个单一的阵列中的所有6000条记录...你能帮我吗.. – user2368920 2013-05-10 07:28:41

+0

这很好。你的程序失败的地方是它试图一次解析所有6000个项目。请尝试使用我的答案 – gerrytan 2013-05-11 16:29:45