如何在Android中的客户端和服务器之间共享资源ID?

时间:2013-04-15 18:24:22

标签: android localization client-server

我正在编写一个客户端(android)/ server(java)应用程序。服务器为客户端发出的每个请求返回true或“false和error code”。我将每条错误消息(字符串)添加到客户端的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));

我认为有一种更好的方式让我无法想到。因为这两种方式听起来很痛苦。如何处理这种情况?

3 个答案:

答案 0 :(得分:1)

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

  1. 您的服务器不依赖于Android。您的服务器的逻辑优势仅适用于Android。如果明天你将为另一个平台开发一个客户端,那么拥有一个独立于平台的协议会好得多。
  2. 每次编辑应用程序,添加新资源等时,都会再次生成R文件,R.string.something可能具有与上一版本不同的值。因此,在您推出应用更新的情况下,您的用户可能会遇到奇怪的错误,因为在您的应用版本1中,资源12345可能指向R.string.something,而版本2可能指向R.string.something_else 。但也许在这一点上有一种保持静态R.string值的方法。
  3. 以下解决方案对我来说似乎是可以接受的:

    您的服务器会返回一些错误代码,例如:

    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());
    

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分: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文件中都有相应的条目。