Android应用程序在数据库读取中使用了太多ram

时间:2015-08-23 10:01:28

标签: android database performance

我使用这段代码从数据库中获取消息。 for for循环超过15000次!这导致应用程序在某些手机中崩溃。我确信这是因为使用数据库方法太多了。并且因为ram低。
有没有解决方案来解决这个问题?
tnx :)

 if (c.moveToFirst()) {
        for (int i = 0; i < c.getCount(); i++) {
            long dateInMilli = Long.parseLong(c.getString(c.getColumnIndexOrThrow("date")).toString());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(dateInMilli);
            body = c.getString(c.getColumnIndexOrThrow("body")).toString();
            date = sdf.format(calendar.getTime());
            address=c.getString(c.getColumnIndexOrThrow("address")).toString();
            writeFile(address + "\n" + body + "\n" + date + "\n\n");
            c.moveToNext();
        }
        stopManagingCursor(c);
        c.close();
    }

3 个答案:

答案 0 :(得分:1)

这里有两个问题。 第一个是内存流失。视频Memory Churn and Performance更多地讨论了这个问题。实际上,您在很长的循环内部进行分配。因此,您正在创建大量分配并对垃圾收集器施加很大压力。我估计如果你描述了你的记忆(见Memory Profilling 101),你会发现很多垃圾收集事件发生。

具体来说,您的new SimpleDateFormat变量应该在循环外部分配,并在其中重复使用多次。您的Calander.getInstance()电话也是如此。还有一些粗略的调用你正在使用字符串分配(调用c.getString()。toString()等),这不会使这更容易。

您遇到的第二个问题很可能是阻止UI线程。您可以在Rendering Performance 101中详细了解相关信息。基本上,系统试图每隔16ms渲染一次屏幕,如果你正在进行20分钟的任务,系统将会停止,并试图抛出一个“不响应的应用程序”。对话框(可以使用Strict Mode检测到)。使用AsyncTask或其他一些原语可以帮助你将这项工作移到UI线程之外,这样它就不会阻止你的应用程序的呈现。

答案 1 :(得分:0)

使用Async TaskIntent Service。两者都在后台运行,不会中断应用程序的正常运行。我更喜欢Async Task,因为它允许您更新UI线程。仅将Intent Service用于运行长任务。

答案 2 :(得分:0)

使用AsyncTask可以解决您的问题。 AsyncTask帮助您执行后台操作并在UI线程上显示其结果。