阅读郭霖《第一行代码》的笔记——第13章 继续进阶,你还应该掌握的高级技巧

#1、全局获取Context的技巧

Android提供了一个Application类,每当应用程序启动的时候,系统就会自动将这个类进行初始化。而我们可以定制一个自己的Application类,以便于管理程序内一些全局的状态信息,比如说全局Context。
定制一个自己Application其实并不复杂,首先我们需要创建一个MyApplication类继承自Application,代码如下所示:

package com.example.compasstest;

import android.app.Application;
import android.content.Context;

/**
* Created by HourGlassRemember on 2016/8/19.
*/
public class MyApplication extends Application {

    private static Context mContext;

    @Override
    public void onCreate() {
        //得到一个应用级别的Context
        mContext = getApplicationContext();
    }

    /**
    * 获取Context
    *
    * @return
    */
    public static Context getContext() {
        return mContext;
    }

}

接下来我们需要告知系统,当程序启动的时候应该初始化MyApplication类,而不是默认的Application类。这一步也很简单,在AndroidManifest.xml文件的标签下进行指定就可以了,代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.compasstest">

    //当程序启动的时候初始化自定义的Application
    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

#2、使用Intent传递对象

使用Intent来传递对象通常有两种实现方式,Serializable和Parcelable。

##(1)、Serializable 方式:
Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让一个类去实现Serializable这个接口就可以了。

public class Person implements Serializable{

    private String name;

    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

传递:

Person person = new Person();
person.setName("Tom");
person.setAge(20);
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("person_data", person);
startActivity(intent);

接收:

Person person = (Person) getIntent().getSerializableExtra("person_data");

##(2)、Parcelable 方式:
除了Serializable之外,使用Parcelable也可以实现相同的效果,不过不同于将对象进行序列化,Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了。

public class Person implements Parcelable {

    private String name;

    private int age;
    ……
    @Override
    public int describeContents() {
        return 0;
    }

    //将Person类中的字段一一写出,注意不同类型对应不同的方法
    @Override
    public 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().getParcelableExtra("person_data");

评价两种方式:
对比一下,Serializable的方式较为简单,但由于会把整个对象进行序列化,因此效率方面会比Parcelable方式低一些,所以在通常情况下还是更加推荐使用Parcelable的方式来实现Intent传递对象的功能。

#3、定制自己的日志工具

代码如下:

package com.example.compasstest;

import android.util.Log;

/**
* 自定义日志工具

* Created by HourGlassRemember on 2016/8/19.
*/
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 WARM = 4;
    public static final int ERROR = 5;
    public static final int NOTHING = 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.v(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 <= WARM) {
            Log.v(tag, msg);
        }
    }

    public static void e(String tag, String msg) {
        if (LEVEL <= ERROR) {
            Log.v(tag, msg);
        }
    }

}

然后我们只需要修改LEVEL常量的值,就可以自由地控制日志的打印行为了。比如让LEVEL等于VERBOSE就可以把所有的日志都打印出来,让LEVEL等于WARN就可以只打印警告以上级别的日志,让LEVEL等于NOTHING就可以把所有日志都屏蔽掉。
使用了这种方法之后,刚才所说的那个问题就不复存在了,你只需要在开发阶段将LEVEL指定成VERBOSE,当项目正式上线的时候将LEVEL指定成NOTHING就可以了。

#4、调试Android程序
自己实践

#5、编写测试用例

测试是软件工程中一个非常重要的环节,而测试用例又可以显著地提高测试的效率和准确性。测试用例其实就是一段普通的程序代码,通常是带有期望的运行结果的,测试者可以根据最终的运行结果来判断程序是否能正常工作。
当项目比较庞大的时候,一般都应该去编写测试用例的。如果我们给项目的每一项功能都编写了测试用例,每当修改或新增任何功能之后,就将所有的测试用例都跑一遍,只要有任何测试用例没有通过,就说明修改或新增的这个功能影响到现有功能了,这样就可以及早地发现问题,避免事故的出现。
a、创建测试工程
b、进行单元测试
单元测试是指对软件中最小的功能模块进行测试,如果软件中的每一个单元都能通过测试,说明代码的健壮性就已经非常好了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值