java - 将 key 从服务器映射到资源

标签 java android android-resources

考虑一下这样一个事实:您有一个从中获取数据的 API,并且该 API 本身会返回某些 key ,接收客户端应使用这些 key 来“解析”要向用户呈现哪个人类可读的字符串。

例如,按键可能如下所示:

DOMAIN_TYPE_SUBTYPE_ID

然后将对应于strings.xml中的给定条目:

<string name="domain_type_subtype_id">This magical item</string>

不幸的是,人类可读的值本身不是从 API 传递的(也不需要翻译),但我正在尝试找出如何将键映射到值的最佳方法( R.string.abc)以最有效的方式。

我突然想到了两种前进的方式(因为我无法更改 API):

1)根据名称进行运行时资源查找,并向所有代码之神祈祷事情不会改变。基本上:

Resources.getSystem().getIdentifier(keyFromTheApi.toLowerCase(), "id", getPackageName())

但是,从我所听到和读到的来看……这确实不是一种高效的方法。我认为在多个字符串的 RecyclerView 设置中使用它是一个非常糟糕的主意。

2)在包含所有数据(字符串、整数)的单例类中的某个位置有一个静态查找字段,但考虑到有很多键需要跟踪,这可能是一个不幸的内存打击吗?

Map<String, Integer> strings = new HashMap<String, Integer>() {{
    put("DOMAIN_TYPE_SUBTYPE_ID", R.string.domain_type_subtype_id);
    //...
}};

🤔

关于如何以良好的方式解决问题有什么建议吗?

最佳答案

  1. 感觉真的很脆弱,我会避免它

  2. 我会做类似的事情,但用 switch 语句代替:

    public static int lookupStringRes(String value) {
      switch (value) {
          case "DOMAIN_TYPE_SUBTYPE_ID": return R.string.domain_type_subtype_id;
    
          // ...
    
          default:
              Log.w("TAG", "Resource not found");
              return -1;
      }
    }
    

并不是说这是最好的解决方案,但我突然想到,这是我首先要考虑的解决方案。 map 与 Switch 的比较取决于内存与性能,您可以在 map 中进行更快的查找,但会消耗内存。

关于java - 将 key 从服务器映射到资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47154964/

相关文章:

java - 如何在 cucumber 的特征文件中提及 'Examples' 中的 boolean 值并确保它在 java 中创建一个方法?

java - Android 中的同步任务

安卓媒体播放器 : start method crashing

android - 无法向 BLE 外设 (ZL-RC04A) 设备发送数据

java - 从另一个类获取 String[]

android - 如何在 Android 中为不同的分辨率使用不同的背景图片?

java - 场景生成器 JavaFX 中的最小和最大属性不起作用

java - 如何使用 iText 确定选择了哪个单选按钮?

java - 如何为Android/Java实现多个事件

android - Android 翻译工具,协助提供上下文