刷新数据时出现Android OutOfMemoryError

时间:2011-12-09 11:30:32

标签: android httpclient out-of-memory

在我的应用中,我每3分钟刷新一次数据。如果应用程序将工作几个小时我会发生这样的错误:

java.lang.OutOfMemoryError
at org.apache.http.util.CharArrayBuffer.<init>(CharArrayBuffer.java:55)
at org.apache.http.util.EntityUtils.toString(EntityUtils.java:131)
at org.apache.http.util.EntityUtils.toString(EntityUtils.java:146)
at com.tab.Api.friends(Api.java:99)
at com.tab.TabLayout.updateFriends(TabLayout.java:692)
at com.tab.TabLayout.access$25(TabLayout.java:690)
at com.tab.TabLayout$7.run(TabLayout.java:684)
at java.lang.Thread.run(Thread.java:1102)

虽然我的代码在“com.tab.Api.friends(Api.java:99)”中的地方看起来像这样:

    String result = "";
    JSONObject jArray = null;
    JSONArray friends = null;

    DefaultHttpClient client = new DefaultHttpClient();   
    try
    {
        HttpGet getFriends = new HttpGet("http://##########"+fb);
        HttpResponse getResponseFriends = client.execute(getFriends);
        HttpEntity getFriendsEntity = getResponseFriends.getEntity();                      
        if (getFriendsEntity != null) 
            result= EntityUtils.toString(getFriendsEntity);   
        try
        {
            jArray = new JSONObject(result);
        }
        catch(JSONException e)
        {

        }
    }
    catch(Exception e)
    {   
        Log.d("LOADING ERROR","Friends section");
    }

3 个答案:

答案 0 :(得分:3)

你某处有内存泄漏。在某个地方,您可以在长期存在的对象中引用内存密集型数据。通过此,GC无法收集这些数据。您的应用程序将在运行的时间内使用更多内存,直到所有内存都用完为止。然后你的应用程序被OutOfMemory Exception杀死

可能对您有帮助的链接:

答案 1 :(得分:0)

尝试使用MAT工具分析内存分配。 UI或其他部分可能存在内存泄漏。 我认为发生此错误的代码不是错误的原因,而只是结果。 本教程可以帮助您:http://macgyverdev.blogspot.com/2011/11/android-track-down-memory-leaks.html

还有一件事 - 最好不要捕获异常,而是更具体的东西(如IOException等)。通过捕获Exception,您可能会捕获一些不应该被捕获的内容(例如NullPointerException),并且会在代码中的其他地方出现问题。

答案 2 :(得分:0)

我认为,Webservice会返回大量数据,这些数据并非由您的移动Ram保存。

当我在这种类型的webservice项目中工作时,我遇到了同样的问题。

请提供提供有限数据的网络服务,例如。距离当前位置记录10公里。