【问题标题】:Code too large for a method in android studio [duplicate]对于android studio中的方法来说代码太大[重复]
【发布时间】:2020-11-10 19:32:21
【问题描述】:

作为https://stackoverflow.com/a/2407930/8970520 的参考,有人告诉它使用属性文件来扩展分配的大小。但我不明白该怎么做。您能否详细说明并解释它是如何工作的?提前致谢。

【问题讨论】:

  • 为什么不把方法变小?
  • 我不能让方法变小,因为它包含数据
  • 数据不应该在源代码中。从外部资源加载它,您已经提到过属性。
  • 我在哪里可以写入数据?我不知道如何提及属性。你能解释一下吗?
  • 将数据拆分为多个部分,并在运行时合并它们。

标签: java android android-studio


【解决方案1】:

在这种情况下,使用属性文件来扩展大小是错误的方法。有些人已经指出了这一点,但你真的,真的不想在源代码中包含数据。如果数据发生变化,您将不得不重新编译您的应用程序并重新部署您的应用程序。

如果数据不经常更改,您可以考虑使用 XML 文件或 SQLite 数据库。但是,如果数据发生更改,您肯定需要一种机制来更新它(即使数据很少更改)。也许考虑一个网络服务。

如果数据经常变化,你肯定会考虑使用网络服务来下载数据。

【讨论】:

  • 数据永远不会改变,但我更频繁地需要数据。
  • 这是一个很好的答案,我并不反对这一点,但在原始链接中,OP 发布它还表明有人在做相对相同的事情,所以我不知道这是否问题与那里的问题确实有任何不同,这可能只是完全重复
  • @sandeysh 在这种情况下,我建议使用 SQLite 数据库或 XML 文件。
【解决方案2】:

Your code是这样的:

public String[] checks(String qww){
    Map<String, String[]> bitmaps  = new HashMap<>();
    String[] cs;
    cs=new String[]{"1", "1", "1", "1", "1", ... 775 more bits ... };
    bitmaps.put("a",cs);
    cs=new String[]{"1", "1", "1", "1", "1", ... 775 more bits ... };
    bitmaps.put("A",cs);
    ... 49 more entries ...
    return bitmaps.get(qww);
}

这在很多层面上都是错误的:

  1. 将位存储为 1 个字符的字符串会浪费内存,因为它使用每个字符串 超过 30 个字节,只是为了存储一个 em>。

    至少,您可以将位字符存储在由单个字符串创建的 char 数组中,例如

    Map<String, char[]> bitmaps  = new HashMap<>();
    bitmaps.put("a", "11111 ... 775 more bits ...".toCharArray());
    bitmaps.put("A", "11111 ... 775 more bits ...".toCharArray());
    ... 49 more entries ...
    return bitmaps.get(qww);
    
  2. 代码在每次调用时构建整个bitmaps 映射,然后获取其中一个映射值并丢弃该映射。浪费处理时间。

    要么只构建一次bitmaps 映射,要么改用switch 语句:

    public char[] checks(String qww) {
        switch (qww) {
            case "a": return "11111 ... 775 more bits ...".toCharArray();
            case "A": return "11111 ... 775 more bits ...".toCharArray();
            ... 49 more entries ...
            default: return null;
        }
    }
    
  3. 该数量的数据应该存储在代码之外,例如在属性文件中。

    当加载到内存中时,这些位应该存储在BitSet

所以,首先创建一个属性文件,例如checks.bitmaps。名称可以是任何东西,它只是一个文本文件。内容:

a = 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000111111110000000000000001111000000000000000001110000000000000000001100000000000000000001000111111110000000010111111111110000000011111111111110000000111100000000000000000000000000000000000000000000000000000000000000000000000000000000000111110000000000000111111110000000000001111111100000000000011111110000000000000111111000000000000000111100000000000000000000000000000000000000000000000000000000000000100000001000000000111000000011000000111110000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
A = 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110000000011111111100000000000001111110000000000000000111100000000000000001111000001111100000001110011111111100000011101111111111100000111111111111111000001111111111111110000001111100000000000000011100000000000000000100000000000000000001000000000000000000000000000111111000000000000111111110000000000001111111100000000000011111110000000000000111111100000000000000111100000000010000000000000000000100000000000000000001100000000000100000011110000000111000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
... 49 more entries ...

这样做的另一个优点是数据更易于查看和编辑。

修改代码如下:

class Main {
    private static final Map<String, BitSet> bitmaps = new HashMap<>();
    static {
        try (InputStream inStream = Main.class.getResourceAsStream("checks.bitmaps")) {
            Properties props = new Properties();
            props.load(inStream);
            for (String key : props.stringPropertyNames()) {
                char[] bits = props.getProperty(key).toCharArray();
                BitSet bitmap = new BitSet(bits.length);
                for (int i = 0; i < bits.length; i++)
                    bitmap.set(i, bits[i] == '1');
                bitmaps.put(key, bitmap);
            }
        } catch (Exception e) {
            throw new IllegalStateException("Bitmap file failed to load: " + e, e);
        }
    }
    public BitSet checks(String qww) {
        return bitmaps.get(qww);
    }
}

调用者现在可以按如下方式检查 1 位:

BitSet bitmap = main.checks(qww);
if (bitmap.get(index)) {
    // Bit is '1'
} else {
    // Bit is '0'
}

【讨论】:

  • 在我的情况下,三种方法中哪一种是最好的? @安德烈亚斯
  • @sandeysh All 3! --- 1) 位存储为单个 0 和 1 字符串,2) bitmaps 映射仅构建一次, 3) bitmaps 映射的数据存储在类之外。 --- 所以,答案的后半部分,这就是我花时间写这一切的原因。
猜你喜欢
  • 2011-10-17
  • 2018-06-19
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 2017-03-10
  • 2011-07-29
相关资源
最近更新 更多