在Android中,如何在客户端和服务器之间共享资源ID?
我正在编写一个客户端(android)/服务器(java)应用程序。对于客户端发出的每个请求,服务器都会返回true或“false和错误代码”。我将每个错误消息(字符串)添加到客户端的strings.xml中 这就是我保存错误代码的方式在Android中,如何在客户端和服务器之间共享资源ID?,android,localization,client-server,Android,Localization,Client Server,我正在编写一个客户端(android)/服务器(java)应用程序。对于客户端发出的每个请求,服务器都会返回true或“false和错误代码”。我将每个错误消息(字符串)添加到客户端的strings.xml中 这就是我保存错误代码的方式 public class ErrorCodes { public static final int WRONG_USERNAME = 1; public static final int WRONG_PASSWORD = 2; publi
public class ErrorCodes {
public static final int WRONG_USERNAME = 1;
public static final int WRONG_PASSWORD = 2;
public static final int WRONG_EMAIL= 3;
...
}
问题是,每次服务器发送错误代码时,我都必须这样(粗略地)处理它
在我看来,有两种方法可以缓解这个过程,但都不优雅
方法1:手动使ErrorCodes值等于R.string值。同样使用这种方法,我也不需要在客户端保留ErrorCodes类
问题:每次添加新的错误消息时,我都必须更新ErrorCodes和strings.xml
方法2:在服务器中使用生成的R.java文件,无需更新任何内容。这是我能想到的最好的了
问题:R.java会带来很多不必要的东西。我必须像在服务器端那样使用它:R.string.xyz
。若服务器并没有用java编码,那个么整个方法都是无用的
如果我使用其中一个,我可以在客户端完成这项工作
int code = conn.receive();
print(getResources().getString(code));
我想有一个更好的方法我想不出来。因为这两种方式听起来都很痛苦。如何处理这种情况?我使用的方法与方法1中描述的方法相同 如果您只想打印错误,请考虑使用json从serwer发送数据,例如:
if(logged_on == true){
server.send("{\"status\":0}");
}else{
server.send("{\"status\":1,\"error\":"+ErrorString);
}
然后在客户端检查status字段,如果等于1,则从error字段打印字符串。我建议保留您的方法。 它将引导您编写一些代码来处理所有情况,但最后,对我来说,这是最健壮的解决方案,因为:
R.string。某些内容的值可能与以前的版本不同。因此,在您推出应用程序更新的情况下,您的用户可能会遇到奇怪的错误,因为在您的应用程序版本1中,资源12345可能指向R.string.something
,在版本2中可能指向R.string.something
。但对于这一点,可能有一种方法可以保持静态R.string
值李>
我似乎可以接受以下解决方案:
您的服务器会为您的错误返回一些代码,例如:
1 for WRONG_USERNAME
2 for WRONG_PASSWORD
3 for WRONG_EMAIL
您可以这样声明字符串:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="error_1">Wrong username!</string>
<string name="error_2">Wrong password!</string>
<string name="error_3">Wrong email!</string>
</resources>
显然,最好的解决方案是在服务器上保留错误描述字符串,但这可能会增加本地化的复杂性。您需要将设备的当前接口语言发送到服务器以获得正确的错误描述
否则,我会在服务器端使用一个简短的文本错误标识符(例如“找不到数据”、“数据库超时”等)——这是有意义的,并且更容易调试和修改android应用程序的字符串表。
在客户端,我将添加相应的错误描述字符串,标识符遵循一些标准方案。例如:“找不到错误数据”,“错误数据库超时”。
然后,要检索错误描述字符串,可以使用反射:
String getErrorString(String stringName)
{
try
{
Field f_a =R.string.class.getDeclaredField(stringName);
int a = f_a.getInt(null);
return getString(a);
}
catch (NoSuchFieldException x)
{
return "No error description for "+stringName;
}
catch (IllegalAccessException x)
{
return "";
}
}
...
String errorDescription = getErrorString("error_"+errorCodeReceivedFromServer);
此外,您还可以编写一个脚本来检查所有服务器错误标识符是否在strings.xml文件中都有相应的条目。关于服务器依赖性,您是对的,我甚至认为这是错误的。我决定采用与你建议的方法相似的方法。我使用了一个哈希表对象errors.put(ErrorCode,R.string.ERROR\u ERROR\u USERNAME)
。非常感谢。
int stringId = getResources().getIdentifier("error_"+errorCode,"string",getPackageName());
String getErrorString(String stringName)
{
try
{
Field f_a =R.string.class.getDeclaredField(stringName);
int a = f_a.getInt(null);
return getString(a);
}
catch (NoSuchFieldException x)
{
return "No error description for "+stringName;
}
catch (IllegalAccessException x)
{
return "";
}
}
...
String errorDescription = getErrorString("error_"+errorCodeReceivedFromServer);