Android开发中的输入合法性检验
Why ?
合法性检查对于程序的健壮性具有重要作用。在Android开发中,良好的合法性检查设计机制可以使程序更加清晰,产生bug更少,交互更加友好。
What ?
合法性检查的目的在于确定边界。对于在程序中流动的数据来说,其流动路径往往是很复杂的。为了保证程序的健壮性,需要保证数据从一端流入并且从另外一端流出的过程中不会发生异常行为。数据流经的每一个方法都必须保证异常被正确处理。为了让每一个函数清晰简单,有必要在数据进入函数之前保证其合法性。让函数中的逻辑不受数据边界的影响。
Who ?
接受合法性检查的对象一般是某一事件触发后需要的初始数据,大多以函数参数形式进行调用。对于Android开发来说。最频繁需要进行检查的莫过于EditText组件。该组件接受用户的输入,是很多功能的数据来源。网络请求的返回数据也是很重要的数据来源。正确处理这些初始的数据,保证其合法性,使得之后的程序逻辑不再受数据异常的影响,同时给予用户一个良好的交互反馈是必须要做的。
When
合法性检查发生在数据中转的入口(也可能是运行的开始)。
How
合法性检查需要从以下几方面着手
- 安全的类型转换工厂
由于程序的数据来源是很复杂的,数据往往需要进行加工和各种数据转换。虽然JAVA提供了许多数据转换的方法。但是,直接在功能代码中使用这些方法是不明智的。很可能产生异常,而当程序没有适当的捕捉和处理异常时,就有可能发生程序崩溃。安全的做法是建立一个安全的类型转换工厂,统一处理需要进行类型转换的数据。
举例:
假设用户输入两个数字,程序需要将两个数字加起来。直接进行类型转换是不安全的。
bad practice :
Double plus(String inputA, String inputB) {
return Double.valueOf(inputA) + Double.valueOf(inputB);
}
good practice:
private Integer plus(String inputA, String inputB){
Integer convertA = StringConverter.getInteger(inputA) ;
Integer convertB = StringConverter.getInteger(inputB) ;
if(convertA != null && convertB != null) {
return convertA + convertB;
}else {
//null must be handled to avoid NullPointerException
return null;
}
}
public class StringConverter {
public static Integer getIntegerValue(String var) {
try{
return Integer.valueOf(var);
}catch(Exception e) {
//ignore much code of print exception and other options
return null;
}
}
}
- 安全的构造函数
在构造函数中检查初始化参数是一个很好的习惯,可以防止不恰当的初始化发生。
举例:
public class Age {
int age;
public Age(int age) throws AgeNegativeException {
if(age == null || age < 0) {
//age can never be a negative number or null
throw(new AgeNegativeException());
}else {
this.age = age;
}
public int getAge() { return age;}
}
public class AgeNegativeException extends Exception {
//exception definition details ignored
}
- 分层清晰的异常处理机制
异常有可能发生在入口处,也有可能发生在运行时。数据流经的地方,都需要确定自己的边界。每一个函数都应该明确自己的责任。对于整个程序结构来说。针对各个不同的模块需要定义相关的异常并且在相应的层面上去处理异常。
举例:
结合上面两个例子,用户需要做一个年龄累加统计。每次输入两个需要累加的年龄,返回累加后的年龄。
public Age addAge(String inputA, String inputB) throws AgeNegativeException {
//calculate and return
return new Age(plus(inputA, inputB));
}
example1:
inputA = “dhkja”; inputB = "10";
如果用户输入了这两个值。那么
plus(inputA, inputB)
会返回一个null。在构造Age的时候就会抛出异常。由于这个异常是用户输入不当造成的因此需要将异常再次抛出到Activity那一层,让Activity提示用户输入有误。
- 为每一个文本框设置校验
为文本框设置校验涉及到两方面
1、校验时间
2、校验提示
校验时间:
- 用户输入前
- 用户输入时
- 失去焦点时
- 用户触发相关方法时
前三种可以通过设置文本监听进行处理,最后一种属于事后检验不设置文本监听。
校验提示:
- 弹出框形式
- ErrorMessage
弹出框可以弹出Toast或者一个dialog,ErrorMessage可以通过设置EditText 的ErrorMessage实现。也可以借助开源组件实现。例如android-edittext-validator
经过如此设计,就不太会受到数据异常的困扰了。关于文本监听和校验提示,会在另外文章说明。
Android开发中的输入合法性检验的更多相关文章
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- 关于Android开发中的证书和密钥等问题
关于Android开发中的证书和密钥等问题 引言 除了Android发布应用签名时需要用到证书外,在进行google Map Api开发和Facebook SDK API开发等时都需要申请API Ke ...
- Android开发中,那些让您觉得相见恨晚的方法、类或接口
Android开发中,那些让你觉得相见恨晚的方法.类或接口本篇文章内容提取自知乎Android开发中,有哪些让你觉得相见恨晚的方法.类或接口?,其实有一部是JAVA的,但是在android开发中也算常 ...
- android开发中的5种存储数据方式
数据存储在开发中是使用最频繁的,根据不同的情况选择不同的存储数据方式对于提高开发效率很有帮助.下面笔者在主要介绍Android平台中实现数据存储的5种方式. 1.使用SharedPreferences ...
- Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令
Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...
- 讨论Android开发中的MVC设计思想
最近闲着没事,总是想想做点什么.在时间空余之时给大家说说MVC设计思想在Android开发中的运用吧! MVC设计思想在Android开发中一直都是一套比较好的设计思想.很多APP的设计都是使用这套方 ...
- Intent 对象在 Android 开发中的应用
转自(http://www.ibm.com/developerworks/cn/opensource/os-cn-android-intent/) Android 是一个开放性移动开发平台,运行在该平 ...
- android开发中常犯的几个错误整理
新手程序猿,在开发中难免会犯各种各样的错误,以下是整理的一些android开发中常见的错误,一起来看看吧. 1.避免将多个类放在一个文件夹里面,除非是一次性使用的内部类. 就是一个文件,最好给分它同名 ...
- Android开发中查看未root真机的app数据库
在Android开发中,如果用到数据库来储存数据,那么难免就要查看数据库中的内容,可是对于未root的真机来说,查看数据库就不是那么容易了,如果仅仅为了查看数据库再把手机root了,有点得不偿失,所以 ...
随机推荐
- 【1】springmvc4 + servlet3 零配置全注解入门项目helloword
自从servlet3.0支持注解,使得javaweb项目使用全注解成为可能. 注解化将成为javaweb的发展方向.包括spring去年推出的spring-boot也是全部使用注解. 代码:https ...
- Java IO流
File类 ·java.io.File类:文件和目录路径名的抽象表示形式,与平台无关 ·File能新建.删除.重命名文件和目录,但File不能访问文件内容本身.如果需要访问文件内容本身,则需要使用输入 ...
- java语法基本知识2
对象的引用相当于C中的指针.对象存在于堆中,引用存在于栈中.引用在函数,可以称作局部变量.
- python的断言
assert的语法格式: assert expression 它的等价语句为: if not expression: raise AssertionError 这段代码用来检测数据类型的断言,因为 a ...
- 随感一:android handler传值更改ui
handler+looper传值更改activity的UI 博客开了一段时间,一直想写点自己的学习经验及体会,等着以后长时间不用再要用到的时候直接拿过来上手.想了想,之前用到handler, 看了几篇 ...
- 更新UI界面的四种方法
一.runOnUiThread(new Runnable()): 二.Handler的sendMessage()系列: 三.Handler的post(): 四.View的post():
- 黑马程序员——【Java高新技术】——类加载器
---------- android培训.java培训.期待与您交流! ---------- 一.概述 (一)类加载器(class loader) 用来动态加载Java类的工具,它本身也是Java类. ...
- 安装mongodb 远程服务器报错
安装的时候百度了各种教程 就是装不上 结果原因看下图吧 后面这神秘代码是什么鬼 加上后就能正常下载了
- xcode 第三方插件遇到问题
xcode 第三方安装的路径 ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins 
- 自学C++第一天
常引用: 可以用在复制构造函数里面.