阅读郭林《第一行代码》的笔记——第13章 继续进阶,你还应该掌握的高级技巧
来源:互联网 发布:捷速pdf文字识别软件 编辑:程序博客网 时间:2024/05/21 10:08
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、进行单元测试
单元测试是指对软件中最小的功能模块进行测试,如果软件中的每一个单元都能通过测试,说明代码的健壮性就已经非常好了。
- 阅读郭林《第一行代码》的笔记——第13章 继续进阶,你还应该掌握的高级技巧
- 继续进阶,你还应该掌握的高级技巧
- 继续进阶,你还应该掌握的高级技巧
- 第二行代码学习笔记——第十三章:进阶之路——你还应该掌握的高级技巧
- 阅读郭林《第一行代码》的笔记——第1章 开始启程,你的第一行Android代码
- 阅读郭林《第一行代码》的笔记——第8章 丰富你的程序,运用手机多媒体
- 阅读郭林《第一行代码》的笔记——第3章 软件也要拼脸蛋,UI开发的点点滴滴
- 阅读郭林《第一行代码》的笔记——第9章 后台默默的劳动者,探究服务
- 阅读郭林《第一行代码》的笔记——第10章 看看精彩的世界,使用网络技术
- 阅读郭林《第一行代码》的笔记——第11章 Android特色开发,基于位置的服务
- 阅读郭林《第一行代码》的笔记——第4章 手机平板要兼顾,探究碎片
- 阅读郭林《第一行代码》的笔记——第5章 全局大喇叭,详解广播机制
- 阅读郭林《第一行代码》的笔记——第12章 Android特色开发,使用传感器
- 阅读郭林《第一行代码》的笔记——第14章 进入实战,开发酷欧天气
- Intent的用法——第一行代码阅读笔记
- activity的生命周期——第一行代码阅读笔记
- 《第一行代码》笔记——第1章 开始启程—你的第一行Android代码
- 《第一行代码》第八章 通知的高级技巧
- Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传
- make
- angularjs学习笔记 ng-class
- ssi服务器端指令详解(shtml)
- 反射机制读取自定义注解
- 阅读郭林《第一行代码》的笔记——第13章 继续进阶,你还应该掌握的高级技巧
- iOS 简单封装的一个夜间模式
- 程映虹:美国高中生如何识别媒体的政治偏见
- 程序集(CLR)调用web service出现"在执行用户定义历城或聚合期间出现.net framework错误,索引(从零开始必须大于或等于零,且小于参数列表的大小)"
- mysql查看所有存储过程,函数,视图,触发器,表
- 修改linux主机名称
- poj2676 sudoku dfs
- Android Transition 学习笔记
- 64位Linux环境 编译32位汇编程序(外链C库函数)