java.lang.OutOfMemoryError: java.lang.Object[] ***** (Android)

java.lang.OutOfMemoryError: java.lang.Object[] ***** (Android)

首先请原谅我的英语。 我的问题是标题。这是我的代码

ArrayList<String> almazaras=null;
almazaras=new ArrayList<>(R.array.almazaras);

分配时崩溃。这是我的 XML:

<resources>
<string-array name="almazaras">
    <item>SAN SEBASTIAN DE ALFACAR</item>
    <item>ACEITES ALGARINEJO</item>
    <item>AGRICOLA LOS TAJOS</item>
    <item>AGRICOLA SANTA BARBARA DE BAZA</item>
    <item>SAN SEBASTIAN DE BENALUA</item>
    <item>SANTA ISABEL DE CAMPOTEJAS</item>
    <item>NTRA. SRA. DE LOS REMEDIOS DE CAMPOTEJAS</item>
    <item>NTRA. SRA. DEL ROSARIO CASTRIL</item>
    <item>SAN ANTONIO DE COGOLLOS</item>
    <item>NTRA. SRA. DEL PILAR DE COLOMERA</item>
    <item>LA ESPERANZA DEL CAMPO</item>
    <item>NTRA. SRA. DE LA CABEZA DE CULLAR</item>
    <item>NTRA. SRA. DEL ROSARIO DE DEHESAS</item>
    <item>NTRA. SRA. DE LOS DOLORES</item>
    <item>SAN ISIDRO DE DEIFONTES</item>
    <item>S.A.T. NTRA. SRA. DEL PERPETUO SOCORRO</item>
    <item>BARAILA DE DOMINGO PEREZ</item>
    <item>NTRA. SRA. DE LOS DOLORES DE FREILA</item>
    <item>ACEITES FUENTES DE CESNA</item>
    <item>SAN FRANCISCO SERRANO</item>
    <item>AGRO-OLIV NTRA. SRA. SOLEDAD DE HUESCAR</item>
    <item>AGRICOLA SAN ROGELIO DE ILLORA</item>
    <item>NTRA. SRA. DE LOS REMEDIOS DE IZNALLOZ</item>
    <item>OLIJAYENA</item>
    <item>UNION AGRICOLA SAN JOSE</item>
    <item>SAN ISIDRO DE LOJA</item>
    <item>SAN FRANCISCO DE ASIS</item>
    <item>ALMAZARA NTRA. SRA. DE LOS REMEDIOS</item>
    <item>VIRGEN DE LA CABEZA</item>
    <item>ALMAZARA DE MONTILLANA</item>
    <item>SAN ILDEFONSO DE PELIGROS</item>
    <item>SAN ROQUE DE PINOS DEL VALLE</item>
    <item>SANTA MONICA DE PIÑAR</item>
    <item>PUERTO LOPE</item>
    <item>SANTA ANA DE SALAR</item>
    <item>ACEITES EL CORTIJILLO</item>
    <item>OLEOTROPIC</item>
    <item>TEMPLE OLIVA</item>
    <item>CAMPO-AGRO OLIVARERA</item>
    <item>AGRARIA CERRO GORDO</item>
    <item>SAN LORENZO DE ZAGRA</item>
    <item>NTRA. SRA. DE LA CABEZA DE ZUJAR</item>
</string-array>

这里是我的错误:

04-15 12:44:48.406    4631-4631/com.example.soke.faeca E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.OutOfMemoryError: java.lang.Object[] of length 2131099649 exceeds the VM limit
        at java.util.ArrayList.<init>(ArrayList.java:75)
        at com.example.soke.faeca.enviarGrupo.onCreate(enviarGrupo.java:55)
        at android.app.Activity.performCreate(Activity.java:5047)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2056)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117)
        at android.app.ActivityThread.access0(ActivityThread.java:134)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4867)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
        at dalvik.system.NativeStart.main(Native Method)

我不知道为什么。在不同的文件上以相同的方式执行此操作(从 XML 获取资源)它可以正常工作。我花了很多时间在 Google 和这个网站上搜索,但没有结果。希望你能解决! 感谢您的帮助!

R.array.almazaras 是一个整数常量(在您的示例中,它是 2131099649)。

您应该先使用常量获取资源,然后将它们放入您的 ArrayList

@Kayaman 是对的。您指的是对数组的常量引用。

试试这个,它应该可以解决问题。

    String arr[] = getResources().getStringArray(R.array.almazaras);
    ArrayList<String> almazaras= (ArrayList)Arrays.asList(arr);

首先获取字符串数组,

Resources res = getResources();
String[] almazarasItems  = res.getStringArray(R.array.almazaras);

并通过

将字符串数组添加到ArrayList
List<String[]> arrayList = new ArrayList<String[]>();
arrayList.add(almazarasItems);

您不能调用 almazaras=new ArrayList<>(R.array.almazaras); 来初始化您的 List。在 Android 中,R.array.almazaras 是您的 array 资源的地址,例如 integer-arraystring-array。您可以在 gen/pkg-name/R 中找到它的 Hex 格式的值。也许你可以打电话给 almazaras=new ArrayList<>();almazaras=new ArrayList<>(a-int-value);.

您正在使用 ID 来初始化 Arraylist。但是 ArrayList 的构造函数将参数解释为 ArrayList 在初始化时应具有的长度。

所以您正在创建一个初始长度为 2131099649 的 Arraylist,这太多了。

您可以使用 context.getResources().getStringArray(R.array.almazaras);