2015-08-23 29 views
0

我使用这段代码从数据库中获取消息。 for可能循环超过15000次!这会导致应用在某些手机中崩溃。我相信它是因为使用数据库方法太多。并由于低公羊。
有没有解决方案来解决这个问题?
TNX :)android应用在数据库读取中使用太多内存

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

回答

0

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

0

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

1

这里有两个问题。 第一个是Memory Churn。视频Memory Churn and Performance更多地谈到了这个问题。实际上,你在一个很长的循环的内部做了分配。因此,您正在创造大量的分配空间,并对垃圾收集器施加很大的压力。我估计如果你分析了你的内存(见Memory Profilling 101),你会发现很多垃圾收集事件。

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

您拥有的第二个问题很可能是阻止UI线程。您可以在Rendering Performance 101了解更多。基本上,系统试图每隔16ms渲染一次屏幕,如果你正在做一个20分钟的任务,系统将停止工作,并尝试抛出一个“应用程序未响应”对话框(使用Strict Mode可以检测到该对话框)。使用AsyncTask或其他一些原语可以帮助您将此工作关闭UI线程,以便它不会阻止应用程序的呈现。

相关问题