哈Ha! 在这篇针对初学者的文章中,我想提供一些技巧,以优化应用程序对设备内存的使用,以免不断获取OutOfMemory,并考虑在当前最新版本的Android Studio(3.4)中使用矢量图像,因为该语言中的大多数俄语资源该主题(关于矢量图像的上
一篇有关Habré的上
一篇文章可以追溯到2015年)已经过时,这常常误导了新手开发人员。 因此,让我们开始吧。
1.使用矢量图像代替位图
当然,不应将包含许多小细节的大图像转换为矢量-如果不多的话,它将占用与栅格一样大的空间。 但是,小图像,例如图标和用户界面的其他详细信息,应转换为矢量,以节省内存。 使用
矢量图像通常更方便。 而现在,最重要的事情-怎么做?
- 打开Android Studio。
- 右键单击可绘制文件夹或其内容>新建>矢量资产

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

- 下一个>完成
- 做完了!
为了从光栅转换为矢量,我可以推荐一个出色的免费
Inkscape应用程序。 关于与他一起工作的一些知识:
- 打开Inkscape。
- 将任何栅格拖入其中。 在打开的窗口中,选择导入选项,然后单击“确定”。
- 在上方工具栏中,选择我们的图像后,选择“路径”>“矢量化栅格”(Shift + Alt + B)。
- 现在最重要的是。 在新窗口中,选中“删除背景”旁边的框,然后选择以下内容:我们的图像是否为彩色,以及进行多少扫描。 我们不要忘记矢量文件的大小直接取决于这两个参数。
扫描次数更多-颜色,阴影和细节更多。 我的妖精,为了获得神圣的外观,因为图像中的颜色数量更多,因此需要进行30次扫描。 这很多,最好不要超过十个,并且选择图片更容易。

- 关闭窗口,单击栅格并使用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文件,这样可以节省更多空间。
我希望我的文章对您有用。 谢谢啦