Android开发——性能优化的基本原则

性能优化的基本知识普及:

Java作为Android开发基本语言,很容易想象AndroidJava的性能优化原则在大多数情况下是通用的)

<1> 代码的最优化:

程序的简洁性、可读性。不同的情况下对二者的侧重点会不同。这一点可以参考算法优化原则对空间和时间的权衡。

<2> 程序的容错性:

亦称程序的健壮性,这决定了客户对产品的满意程度

<3> 程序中各个部分的执行效率:

方法是程序调度单元的基本单位,因此方法的执行效率往往会直接影响整个程序的效率

<4> 程序的系统资源的消耗:

这一点主要是针对资源消耗和效率之间提出的问题,这也是很典型的时间和空间之间的权衡利弊(内存欧巴)

<5> UI的合理设计

  

针对Java的优化原则:

一、用静态工厂方法代替构造方法:

a) 获取实例的方法名更加灵活

b) 可以灵活的使用之前创造的对象,比如设计模式里单例模式的实现

c) 返回实例也比较灵活,不一定是本类的对象

#####注意,也不要一味照搬,要按照具体情况运用#####

 

二、避免创建重复的对象:

一提到这个问题,就不得不让人想起Java中一个特别经典的案例:StirngStringBuilderStringBuffer三基友的关系,其实主要是Stirng和后两者之间(具体关系我就不明说了,学了java的人都知道,哈哈,不知道的赶紧去BaiduGoogle)。在我们使用字符串拼接的时候,最好能够使用后两者中的一个,当然啦,如果是数量次数比较少,这个要求就不是特别硬性了

还有就是方法在调用的时候尽量要避免重复地在方法体内创建同样的对象,我们可以将对象的创建放在类的静态代码块中,让它在类加载的同时就创建好,之后多次复用即可......


三、防止内存泄露:

(科普:内存泄露即就是使用完毕的内存空间因未及时释放后失去引用而导致无法处理的内存垃圾在内存中的堆积)

	public class Stack{
		private Person[] persons;
		private int currentIndex;.....
		public Person pop()// method 1
		{
			if(currentIndex== 0)
				throw new Exception();
			currentIndex--;
			return persons[currentIndex] ;
		}
		
		public Person pop2()// method2 
		{
			if(currentIndex== 0)
				throw new Exception();
			currentIndex--;
			Person person= persons[currentIndex];
			persons[currentIndex] = null;//设置为空,提示开始回收该内存块
			return  person;
		}
<span style="white-space:pre">	</span>}	
大家 可以看看上边这个自定义的堆栈类,对比一下两种弹栈方式以及今后入栈会造成的不同的后果


四、返回0长度的集合而非null

在我们获取集合的子集的时候,如果子集长度为0,就直接返回该集合即可,没必要再去用null代替。因为在方法回调之后如果返回的是null,还得判断是否为null再进行下一步操作~~~否则就会抛出空指针异常!!!哈哈哈,有木有感觉有点意思呢?

五、通过接口引用对象

我们在创建接口的实现类的对象的时候,最好采用接口来对该对象进行引用,这样我们在后期替换为其他类型的实现类的时候,就只需要替换掉创建对象的那一部分即可。而更加有意义的一点就是Java中面向对象的一大特点: 多态~~~ps:用来屏蔽掉子类之间的差异,当然啦,多态也不仅仅局限于接口


避免ANR

(造成原因:主线程长时间未响应或者说主线程被长时间阻塞而导致的app崩溃)
哈哈,那很简单啊,我们把阻塞程序运行的部分程序块(如下载,时间复杂度较高的算法,访问网络等耗时操作)放入子线程中就ok啦!!!至于它们对UI更新的请求,我们可以通过Android的Handler机制来解决问题~~~当然啦,还有我们的runOnUiThread来应对~

性能检测

一、执行时间的检测:

对计算机比较了解或者是学过组成原理等知识的同学们都了解,对存储器(外存,内存)的读速度往往会比写的速度要快将近一个数量级,所以在我们写程序的时候,要尽量避免对内存(或者rom)进行频繁的写操作~~~
需要使用到的方法:System.currentTimeMillis();//获取当前系统距离格林威治时间(19701,1 00:00)的毫秒数。

二、内存消耗测试:

我们 可以在程序或者方法运行前后对当前内存的剩余量做差来达到内存消耗的测试:
需要使用到的方法:Runtime.getRuntime().totalMemory();
Runtime.getRuntime().freeMemory();

三、性能测试工具traceview

先贴上一测试代码:
package com.bob.studiodev;

import android.app.Activity;
import android.os.Bundle;
import android.os.Debug;
import android.view.View;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends Activity {
    private List<Integer> list = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    public void test1() {//向内存中写入10000个数据
        for (int i = 0; i < 10000;i++)
        {
            list.add(i);
        }
    }

    public void test2() {//向内存中读取10000个数据
        for (int i = 0; i < 10000;i++)
        {
            list.get(i);
        }
    }

    public void onClick(View view) {
        Debug.startMethodTracing("activity_trace");//开始检测

        test1();
        test2();

        Debug.stopMethodTracing();//结束检测
    }
}
以上代码是对test1 和test2进行的性能检测,程序运行完毕之后会在sd卡根目录下产生一个activity_trace.trace的文件,然后将它导出之后使用sdk 目录下tools下的traceview来打开这个文件,接下来就会有如下gui框:(windows,mac osx,linux用命令行执行文件不懂的赶紧问隔壁老王去)
下半部分分别表示的是程序中各个部分所占用的cpu以及执行所占用时间!!!
别忘了添加如下权限for your application:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

注意事项:
我在运行的时候,总是提示sd卡没有读写权限,然后我有去用chmod 权限 文件名 来给它赋予权限,不行,然后重新挂载当前目录下所有文件 
mount -o remount rw / 然后重新使用权限赋予命令,虽然成功修改了storage的权限,但是其下的sdcard目录实在是改不了了........最后突然想起来Lz还有刚刚新买的小米Note,于是乎就顺利得执行完毕喽~~~


-------------------------------------------------------------------------完-------------------------------------------------------------------------------

ps:本人任何博客为保持有效性,会不定期更新的~~~欢迎大家来访

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值