Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中,如何在客户端和服务器之间共享资源ID?_Android_Localization_Client Server - Fatal编程技术网

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

在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

我正在编写一个客户端(android)/服务器(java)应用程序。对于客户端发出的每个请求,服务器都会返回true或“false和错误代码”。我将每个错误消息(字符串)添加到客户端的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;
    ...
}
问题是,每次服务器发送错误代码时,我都必须这样(粗略地)处理它

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

方法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字段打印字符串。

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

  • 您的服务器不会依赖于Android。服务器的逻辑仅对Android有效。如果明天您将为另一个平台开发一个客户端,那么最好有一个独立于平台的协议
  • 每次编辑应用程序、添加新资源等时,都会再次生成R文件并
    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);