内存不足并在Android Studio中使用矢量图像

哈Ha! 在这篇针对初学者的文章中,我想提供一些技巧,以优化应用程序对设备内存的使用,以免不断获取OutOfMemory,并考虑在当前最新版本的Android Studio(3.4)中使用矢量图像,因为该语言中的大多数俄语资源该主题(关于矢量图像的上一篇有关Habré的上一篇文章可以追溯到2015年)已经过时,这常常误导了新手开发人员。 因此,让我们开始吧。

1.使用矢量图像代替位图


当然,不应将包含许多小细节的大图像转换为矢量-如果不多的话,它将占用与栅格一样大的空间。 但是,小图像,例如图标和用户界面的其他详细信息,应转换为矢量,以节省内存。 使用矢量图像通常更方便。 而现在,最重要的事情-怎么做?

  1. 打开Android Studio。
  2. 右键单击可绘制文件夹或其内容>新建>矢量资产

  3. 指定svg文件的路径。 如果图像的形状不规则,则建议您选中“替代”参数旁边的框-否则图像将被调整为标准尺寸,这可能会扭曲其比例。

  4. 下一个>完成
  5. 做完了!

为了从光栅转换为矢量,我可以推荐一个出色的免费Inkscape应用程序。 关于与他一起工作的一些知识:

  1. 打开Inkscape。
  2. 将任何栅格拖入其中。 在打开的窗口中,选择导入选项,然后单击“确定”。
  3. 在上方工具栏中,选择我们的图像后,选择“路径”>“矢量化栅格”(Shift + Alt + B)。
  4. 现在最重要的是。 在新窗口中,选中“删除背景”旁边的框,然后选择以下内容:我们的图像是否为彩色,以及进行多少扫描。 我们不要忘记矢量文件的大小直接取决于这两个参数。

    扫描次数更多-颜色,阴影和细节更多。 我的妖精,为了获得神圣的外观,因为图像中的颜色数量更多,因此需要进行30次扫描。 这很多,最好不要超过十个,并且选择图片更容易。

  5. 关闭窗口,单击栅格并使用Delete键将其删除,然后转到“文件”>“文档属性”(Shift + Ctrl + D),调整内容的页面大小。

现在,我们将进行一个小测试,证明向量在节省内存方面的优势。
我用一个ImageView创建了一个新项目,并对其应用了将其从A点移动到B点的动画,并交替将图像更改为光栅和矢量。 我们看一下数据。

栅格



向量



差异几乎是两倍。 我认为这很有说服力。

2.增加堆大小


为此,请转到项目的清单(app> manifests> AndroidManifest.xml),然后在应用程序列中添加以下行:

android:largeHeap="true" 

实际上,增加堆并不是解决OutOfMemory问题的方法,而是将其推到了很远的架子上。 我们没有优化应用程序对设备内存的使用,而是为其提供了更多空间。 不要忘记,每个设备都为应用程序分配了自己的主存储和辅助存储容量。

3.避免内存泄漏


任何应用程序在其工作中都会使用许多对象,这些对象当然会在内存中占据一定位置。 理想情况下,垃圾收集器应该从其中删除未使用的对象,但是有时会存在所谓的“内存泄漏”,这些泄漏会在应用程序中引起严重的问题。 内存泄漏的原因有多种, 这里将详细介绍。

我个人希望为Badoo开发的WeakHandler库提供建议,该库旨在消除与android.os.Handler的滥用相关的内存泄漏。 要使用此库,请将以下行添加到gradle文件的“依赖项”列中(Gradle Scripts> build.gradle(模块:app)):

 compile 'com.badoo.mobile:android-weak-handler:1.1' 

并在java文件中:

 private WeakHandler mHandler; protected void onCreate(Bundle savedInstanceState) { mHandler = new WeakHandler(); ... } private void onClick(View view) { mHandler.postDelayed(new Runnable() { view.setVisibility(View.INVISIBLE); }, 5000); } 

如果工作室没有自动导入WeakHandler本身,请不要忘记导入它。

4.避免大型延时动画


Android Studio中的逐帧动画是一件方便的事,但不是最经济的一种。 如果您在其中使用大量图像,则肯定会得到OutOfMemory。

但是,如果您确实需要它,最好将gif图像与Android Gif Drawable库一起使用。 与Android Studio的逐帧动画相比,该库简化了gif的工作,并且占用的内存更少。 要使用此库,请将以下行添加到gradle文件的“依赖项”列中(Gradle Scripts> build.gradle(模块:app)):

 implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.16' 

在构建脚本和allproject列的第二个gradle文件(Gradle Scripts> build.gradle(模块:“您的应用程序名称”))中,该行:

 mavenCentral() 

并在java文件中:

 GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable._ ); gifFromResource.start(); 

要禁用gif,请写入stop()而不是start()。 同样不要忘记压缩gif文件,这样可以节省更多空间。

我希望我的文章对您有用。 谢谢啦

Source: https://habr.com/ru/post/zh-CN450566/


All Articles