0

我正在编写一个客户端(android)/服务器(java)应用程序。服务器为客户端发出的每个请求返回真或“假和错误代码”。我将每个错误消息(字符串)添加到客户端的 strings.xml 中。

这就是我保留错误代码的方式;

public class ErrorCodes {
    public static final int WRONG_USERNAME = 1;
    public static final int WRONG_PASSWORD = 2;
    public static final int WRONG_EMAIL= 3;
    ...
}

问题是,每次服务器发送错误代码时,我都必须(大致)那样处理它;

int code = conn.receive();
if(code == ErrorCodes.WRONG_USERNAME)
    print(getResources().getString(R.string.WRONG_USERNAME_ERROR));
else if(code == ErrorCodes.WRONG_PASSWORD)
    print(getResources().getString(R.string.WRONG_PASSWORD_ERROR));
...

在我看来,有两种方法可以简化这个过程,但都不优雅。

方法 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));

我想有一个更好的方法我想不出。因为这两种方式听起来都很痛苦。如何处理这种情况?

4

3 回答 3

2

我建议保持你的方法。它将引导您编写一些代码来处理所有情况,但最后,对我来说,这是最强大的解决方案,因为:

  1. 您的服务器将不依赖于 Android。您的服务器的逻辑将仅对 Android 有效。如果明天您将为另一个平台开发一个客户端,那么拥有一个独立于平台的协议会更好。
  2. 每次您编辑应用程序、添加新资源等时,您的 R 文件都会再次生成,并且R.string.something可能具有与先前构建不同的值。因此,在您推出应用程序更新的情况下,您的用户可能会遇到奇怪的错误,因为在您的应用程序的版本 1 中,资源 12345 可能指向,R.string.something而在版本 2 中可能指向R.string.something_else. 但也许对于这一点,有一种方法可以保持静态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>

然后按名称加载字符串资源:

int stringId = getResources().getIdentifier("error_"+errorCode,"string",getPackageName());
于 2013-04-15T18:47:29.257 回答
0

我使用您在方法 1 中描述的相同方法

如果您只想打印错误,请考虑使用 json 从服务器发送数据,例如:

if(logged_on == true){
    server.send("{\"status\":0}");
}else{
    server.send("{\"status\":1,\"error\":"+ErrorString);
}

然后在客户端检查状态字段,如果等于 1 从错误字段中打印字符串。

于 2013-04-15T18:44:52.170 回答
0

最好的解决方案显然是在服务器上保留错误描述字符串,但这可能会给本地化带来额外的复杂性。您需要将设备的当前界面语言发送到服务器以获得正确的错误描述

否则我会在服务器端使用简短的文本错误标识符(例如“no_data_found”、“db_timeout”等)——这很有意义并且更容易调试和修改 android 应用程序的字符串表。
在客户端,我会添加相应的错误描述字符串,标识符遵循一些标准方案。例如:“error_no_data_found”、“error_db_timeout”。
然后,要检索错误描述字符串,您可以使用反射:

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 文件中都有相应的条目。

于 2013-04-15T21:45:40.963 回答