Android程序员和后天交互时,后台会返回数据或错误码,当我们拿到错误码时,不能直接把错误码展示给用户,而是要把错误码转换为用户能够理解的信息。
1. 先在资源文件夹string中定义错误码对应的字符串,如下:
<string name="N500">请求服务器超时!</string>
<string name="B33015">格口正在建包,已锁定</string>
<string name="B33016">不在当前分拣方案中</string>
<string name="B33017">不存在未上传的建包</string>
<string name="B33012">沒有包裹在箱</string>
<string name="B33018">包裹已上传,不能在终端撤销</string>
2. 创建转换的工具类:
public class Converter {
public static CharSequence getErrorString(Context context, String errorCode) {
//判断传进来的错误码是否全为数字
Pattern pattern = Pattern.compile("[0-9]*");
boolean isNum = pattern.matcher(errorCode.trim()).matches();
int resId;
if (isNum){ //全为数字,则返回错误码
return "errorCode: " + errorCode;
} else { //否则对错误码进行转换
resId = context.getResources().getIdentifier(errorCode, "string", context.getPackageName());
if (resId == 0)
return errorCode;
}
return context.getResources().getText(resId);
}
}
3. 在捕获到异常时,可以使用此工具类对错误码进行转换,如下:
try {
sortClient.localBusiness.DoBusiness(inParam);
log.info("<packing> 撤销建包 " + history.PackageNo);
} catch (DBSException e) {
Toast.makeText(HistoryActivity.this, Converter.getErrorString(HistoryActivity.this, e.errorcode), Toast.LENGTH_SHORT).show();
}
分析:上面的转换工具对传过来的字符串有要求:如果全为数字,则转换失败。所以上面有对要转换的字符串进行判断,全为数字则返回错误码。
针对上面的问题,下面提供一个解决的方案:
1. 在资源文件夹string中定义错误码时,手动给错误码添加一个前缀,如 “E” :
<string name="E11001">外设驱动程序不存在</string>
<string name="E11002">外设驱动功能不存在</string>
<string name="E11003">外设通讯异常</string>
<string name="E11004">应答超时</string>
<string name="E11005">功能执行超时</string>
<string name="E11011">未绑定外设驱动服务</string>
2. 创建转换的工具类:
public class Converter {
static Context context;
public static void setContext(Application application) {
Converter.context = application;
}
// Return a resource value for the given error code(Automatically prefix E),Return code with prefix E if no such resource was found.
public static String getResourceString(int errorCode) {
return getResourceString("E" + errorCode);
}
// Return a resource value for the given resource name,Return name if no such resource was found or no context setting.
public static String getResourceString(String name) {
if (context != null) {
int resId = context.getResources().getIdentifier(name, "string", context.getPackageName());
if (resId == 0) {
return name;
}
return context.getResources().getString(resId);
}
return name;
}
}
3. 在捕获到异常时,可以使用此工具类对错误码进行转换,如下:
try {
Proxy4Device.getInstance().openBox4Access(salveNo, productLocationId);
} catch (DcdzSystemException e) {
Toast.makeText(context, "开箱失败:"+ Converter.getResourceString(e.getErrorCode()),Toast.LENGTH_SHORT).show();
}
总结:当服务端返回的错误码不全为数字时,可以使用第一个转换方式;当服务端返回的错误码有全为数字的情况时,要使用第二个转换方式,先对错误码进行 “加工” 处理。