安卓(Android App)性能优化,解决卡顿,内存溢出等一系列问题

其实网上写安卓性能优化的文章很多,本来不想写的,但是今天突然看到一个以前没注意过的点,加上自己平时也遇到过很多很多,所以想写一篇把所有知道的性能问题全部集合起来,这篇文章我会持续更新。

1.循环使用

        平时在访问一个属性的时候效率远比一个固定变量低,如果你的循环估计次数常常大于 5,
假设 xxx.GetLength()方法的值一般大于 5,正常的情况下我们会这么写,比如
for(int i=0;i<xxx.GetLength();i++)
这里 xxx.GetLength 在每次循环都要调用,必然会影响程序效率,在游戏开发中显得更为明显,
改进的方法应该为
int j=xxx.GetLength()
for(int i=0;i<j;i++)  

为什么先写这个,因为类似于这种小的点我们平时很难注意,写这篇文章的时候我也是第一次看到这个点。

2.图片的优化

        这是我在刚开始开发的时候遇到的最多的问题,就是图片造成的内存溢出。

       一.首先是图片大小的问题,往往是因为美工给到我们的图太大,导致加载的时候内存吃不消,对于大的图片我推荐一个网站

https://tinypng.com/,这个网站可以对图片进行无损压缩,压缩比例十分的高,效果很好。如果是一些小的图建议美工给到svg的图,然后我们通过android studio自带的功能转化成vector格式,这样可以起到很好的优化效果。

       二.由于使用的图片资源没有得到释放导致的内存溢出,优先你需要去了解一下图片的三级缓存架构,在这我不建议大家自己去写三级缓存的,因为有现成的好的框架不用何必浪费时间的,而且自己写的问题肯定很多,但是必须要了解其中的原理,所以我这直接推荐大家使用几款图片加载的框架 ,以下几款图片加载框架是现在主流的框架,能十分有效解决图片内存溢出的问题,至于各家的优缺点,怎么使用自己去google吧,除了Fresco用的人比较少之外,前三个用的都很多。

一定要学会使用很多好的框架和工具,站在巨人的肩膀上你才能看的更远

3.String字符串的拼接

      我们在写代码的时候经常会遇到字符串的拼接,而我们最经常的一种写法就是两个字符串相加,这样其实是一种效率很低的做法,而我们最该用的其实是StringBuffer和StringBuilder去拼接,以下是这三种方式拼接效率的对比

String s = "";
long sBeginTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
     s+="s";
}
long sEndTime = System.currentTimeMillis();
System.out.println("s拼接100000遍s耗时: " + (sEndTime - sBeginTime) + "ms");
         
StringBuffer s1 = new StringBuffer();
long s1BeginTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
     s1.append("s");
}
long s1EndTime = System.currentTimeMillis();
System.out.println("s1拼接100000遍s耗时: " + (s1EndTime - s1BeginTime) + "ms");
         
StringBuilder s2 = new StringBuilder();
long s2BeginTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
    s2.append("s");
}
long s2EndTime = System.currentTimeMillis();
System.out.println("s2拼接100000遍s耗时: " + (s2EndTime - s2BeginTime) + "ms");

     

     这是测试的结果,很明显,使用+号拼接字符串,其效率明显较低,而使用StringBuffer和StringBuilder的append()方法进行拼接,效率是使用+号拼接方式的百倍甚至千倍,而StringBuffer的效率比StringBuilder低些,这是由于StringBuffer实现了线程安全,效率相对于StringBuilder稍微低点也是不可避免的。所以在字符串的累加操作中,建议结合线程问题选择,应避免使用+号拼接字符串。

4.不用的资源的释放

     cursor使用过后一定要调用cursor.close()释放掉;

     另外我们习惯使用handler去postDelayed()执行任务,不要忘了退出的时候调用handler.removeCallbacksAndMessages(null)去移除所有的消息和回调函数。

发布了24 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_26923265/article/details/85340872