如何防止Android中的内存泄漏?

时间:2019-02-11 15:02:25

标签: android optimization

几个月前,我开始用android编程,编写了第一个应用程序,该应用程序包括像服务员应用程序一样接受订单。

因为它是第一个应用程序,您可以想象我并不是针对优化,但这是一个很大的错误。我已经在一些餐馆部署了应用程序,直到目前为止一切正常。

问题:

现在,该应用程序已安装在一家餐馆中,他们在一张桌子上接受很多订单,他们最多可以在10分钟内接受订单,昨天我接到一个电话,他们说该应用程序崩溃了有很多人的桌子。

现在,我正在尝试模拟公司中发生的事情。

应用程序:

该应用程序由主屏幕组成,用户可以在其中选择输入设置或订单,然后进行另一个“登录”活动,然后在“主”中进行提示,要求输入表号,然后服务员接订单并发送。 发送后,我只是通过清除项目中的recyclerView并将所有值都设置为0来“重置”活动或更好,但是我认为这会产生“少量”内存泄漏。

结论:

现在,我将在如何改善应用程序性能或更好地如何防止内存泄漏方面,甚至在服务员发送收据后以某种方式“重新创建”活动方面,向我提出尽可能多的建议“保存”一些内存或idk。

实际上这是一个配置文件的屏幕,我不知道这可能有帮助

enter image description here

5 个答案:

答案 0 :(得分:3)

首先,您的应用似乎没有CrashReport库。因此,第一件事就是将Crashlytics添加到您的应用中。

  

借助适用于Android的功能强大的崩溃报告解决方案,可以清晰,可行地洞察应用程序问题

然后,如果您认为自己的应用程序存在漏洞,建议您使用CanaryLeak

  

用于Android和Java的内存泄漏检测库。

一旦Crashlytics就位,您将知道问题的出处。它可以为您提供使您的应用崩溃的代码行。

答案 1 :(得分:2)

您是否有未取消订阅事件的订阅者?这是内存泄漏的常见陷阱。我建议您使用内存分析器来分析内存使用情况。如果您使用的是android studio,那么本文将为您做一个介绍:

https://developer.android.com/studio/profile/memory-profiler

答案 2 :(得分:2)

避免内存泄漏恕我直言的良好做法:

  • 避免在助手或数据类中静态存储Android上下文
  • 完成工作后,
  • 请记住取消广播接收者的注册。一个好的做法是在onResume()方法内注册,然后在onPause()方法内注销
  • 在“模型”类中更喜欢使用LiveData
  • 使用LeakCanary库来检测任何潜在的泄漏
  • 请谨慎使用静态变量,请记住将它们设置为null一次对应用程序不再有用,这样它们就有资格成为垃圾收集。

您可以在Medium上找到有关此主题的有趣的article

答案 3 :(得分:1)

正如其他人所强调的那样,没有细节,很难知道是什么原因造成了内存泄漏。 我在北京的餐馆(Lily's American Diners)编写了适用于Android平板电脑的应用程序,并且长期以来一直在为泄密而苦苦挣扎。问题是您的平板电脑每天要运行14个小时的Android平板电脑,因此您必须拥有非常强大的体系结构,以免事情泄漏并被操作系统破坏。 1)Canaryleak和Crashylytics是好主意。我用过ACRA。 2)尽量避免弹出窗口,全局变量,所有显而易见的事情。 3)我使用后台服务来处理将数据上传到服务器,从服务器下载菜单,打印到POS打印机。 4)对于网络操作,请使用OKHTTP,它将使所有异步网络操作变得更加干净。 5)对于图像加载,请使用Square Picasso。它使所有图像兑现变得更干净。 6)在您的生命周期架构中,尽量减少活动。我将1个单实例活动用于初始屏幕初始负载,如果他们选择执行管理器操作,设置等,则使用1个单实例活动,那么,有1个活动全天运行并处理所有事情。在该活动中,我使用ViewFlipper快速更改以下每个操作的“页面”(视图): a)从菜单中选择项目 b)显示选定项目的票证 c)展示该菜的大图片或每种菜的特殊选择 d)显示成功的订单 e)显示未成功发送的订单 f)为客户或服务员(无论谁选择)显示选择表屏幕。 g)显示每日特价 另一个大问题是持久性存储,因此在此类应用程序的长期运行期间,订单和菜单不会丢失等。我广泛使用了共享的首选项。 祝你好运。

答案 4 :(得分:0)

有很多不同的可能性,例如:

  1. 数据库保持打开状态
  2. 数据无法正确封装。
  3. 来自共享首选项

这些是数据泄漏的常见可能性。