入门Android开发--第一行代码--笔记系列(九)

来源:互联网 发布:python csv文件 求和 编辑:程序博客网 时间:2024/05/21 19:36

其他高级技巧

全局获取Context

除了传参,
可以定制一个自己的Application类

public class MyApplication extends Application {private static Context context;@Overridepublic void onCreate() {    context=getApplicationContext();//这里没写super}public static Context getContext(){    return context;}}

然后需要将配置文件里的application改成我们定制的MyApplication
这样随时都可以获取context了
(可能是我目前没碰到,感觉getApplicationContext()随时都可以获取啊,不需要这么实现)

使用Intent传递对象

想较而言,Serializeble虽然使用简单,但是会把整个对象序列化,效率较低,所以还是推荐用Parcelable实现Intent传递对象。

Serializeble

Serializeble是序列化的意思,表示将一个对象转换成可存储或者可传输的状态。序列化后的对象可以在网络上传输,也可以存储到本地。
序列化的使用:

public class Person implements Serializable {    private String name;    private int age;    .... }//然后再activity中实例化后传递即可Person person=new Person();prson.setName("A"); person.setAge(2);Intent intent=new Intent(Main.this,New.class);intent.putExtra("person",person);startActivity(intent);//在New.class中获取Person person =(Person)getIntent().getSerializableExtra("person");

Parcelable

Parcelable的实现原理是将一个完整的对象进行分解,分解成Intent支持的多个数据部分

public class Person implements Parcelable {private String name;private int age;@Overridepublic int describeContents() {    return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {    dest.writeString(name);//写出name    dest.writeInt(age);//写出age}//这里的读取顺序一定要和上面的写出顺序 完全相同public static final Parcelable.Creator<Person> CREATOR=new Parcelable.Creator<Person>(){    @Override    public Person createFromParcel(Parcel source) {        Person person=new Person();        person.name=source.readString();//读取name        person.age=source.readInt();//读取age        return person;    }    @Override    public Person[] newArray(int size) {        return new Person[size];    }};}//获取方法类似Person person=(Person)getIntent().getParcelabelExtra("person");

定制自己的日志工具

日志工具虽然很好用,但是项目大了之后,log不仅会降低程序效率还有可能泄露一些信息。但是又不能直接删除。不可能一行行删。也不会写完一个功能删一次吧。
所以就需要定制一个调试可用,上线屏蔽的日志工具。

public class LogUtil {public static final int VERBOSE=1;public static final int DEBUG=2;public static final int INFO=3;public static final int WARN=4;public static final int ERROR=5;public static final int NOTING=6;public static final int LEVEL=VERBOSE;public static void v(String tag,String msg){    if(LEVEL<=VERBOSE) {        Log.v(tag,msg);    }}public static void d(String tag,String msg){    if(LEVEL<=DEBUG) {        Log.d(tag,msg);    }}public static void i(String tag,String msg){    if(LEVEL<=INFO) {        Log.v(tag,msg);    }}public static void w(String tag,String msg){    if(LEVEL<=WARN) {        Log.v(tag,msg);    }}public static void e(String tag,String msg){    if(LEVEL<=ERROR) {        Log.v(tag,msg);    }}}

真心觉得好厉害啊。。雅蠛蝶,都怎么想出来的。

调试android程序

= = 这个不应该最早说吗。。。

编写测试用例

这个也是我这个外行人听起来一直觉得很高端的地方。两眼冒光啊,写个代码已经很了不起了,还写个测试代码的代码。艾玛

测试用例主要防止修改代码附带引起的预期之外的事故发生。

创建测试工程

AdroidStudio里在创建工程的时候,会自动创建一个AndroidTest工程,在里面创建一个测试类,注意继承测试父类,比如AndroidTestCase

public class TestClass extends AndroidTestCase{//会在所有测试用例执行之前调用@Overrideprotected void setUp() throws Exception {    super.setUp();}//定义一个test开头的方法,测试框架会自动调用这个方法public void testAddActivity(){    assertEquals(0,ActivityCollectorUtil.activities.size());//断言activity数量为零    MainActivity mainActivity=new MainActivity();    ActivityCollectorUtil.addActivity(mainActivity);//手动添加,new的时候没有添加吗?    assertEquals(1,ActivityCollectorUtil.activities.size());//再断言数量为1}//会在所有测试用例执行之后调用@Overrideprotected void tearDown() throws Exception {    super.tearDown();}}

像运行程序一样,运行这个测试用例,会发现成功。
但是如果你再添加一次,mainActivity,你是希望数量依旧为1的,可是这里会变成2。于是你发现需要修改ActivityCollectorUtil.addActivity里的代码。
就这样不断测试,不断修改,代码就会更加健壮。

好吧。。测试用例好像也没啥神秘的。

0 0