【问题标题】:android ArrayMap throws java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]android ArrayMap 抛出 java.lang.ClassCastException:java.lang.String 无法转换为 java.lang.Object[]
【发布时间】:2016-09-06 07:45:32
【问题描述】:

我用android.support.v4.util.ArrayMap

喜欢这个

ArrayMap<String, ArrayList<Object>> group = new ArrayMap<>();

但我打电话给ArrayMap.put(key,value)

allocArrays(final int size) 方法中抛出ClassCastException

 private void allocArrays(final int size) {
    if (size == (BASE_SIZE*2)) {
        synchronized (ArrayMap.class) {
            if (mTwiceBaseCache != null) {
                final Object[] array = mTwiceBaseCache;
                mArray = array;
                mTwiceBaseCache = (Object[])array[0];
                mHashes = (int[])array[1];
                array[0] = array[1] = null;
                mTwiceBaseCacheSize--;
                if (DEBUG) Log.d(TAG, "Retrieving 2x cache " + mHashes
                        + " now have " + mTwiceBaseCacheSize + " entries");
                return;
            }
        }
    } else if (size == BASE_SIZE) {
        synchronized (ArrayMap.class) {
            if (mBaseCache != null) {
                final Object[] array = mBaseCache;
                mArray = array;
                mBaseCache = (Object[])array[0];
                mHashes = (int[])array[1];
                array[0] = array[1] = null;
                mBaseCacheSize--;
                if (DEBUG) Log.d(TAG, "Retrieving 1x cache " + mHashes
                        + " now have " + mBaseCacheSize + " entries");
                return;
            }
        }
    }

    mHashes = new int[size];
    mArray = new Object[size<<1];
}

应用程序在此行崩溃mBaseCache = (Object[])array[0];

非常感谢!!!

【问题讨论】:

  • 抛出 java.lang.ClassCastException: java.lang.String 不能转换为 java.lang.Object[]
  • 你的代码太乱了。
  • mBaseCache 是一个对象还是一个对象数组?
  • 该错误与ArrayMap无关。 mBaseCache 和数组都是 Object[]。您正在尝试将恰好是 String 的单个 Object 转换为 Object[]
  • mBaseCache 是 ArrayMap 缓存 Array is object[] type @AhlemJarrar

标签: java android


【解决方案1】:

问题的原因是多线程。

此错误已修复https://issuetracker.google.com/issues/37114373 更新支持 V25.4.0 已修复

【讨论】:

  • @yangil 修复了吗?
【解决方案2】:

这是解决此问题的一种方法:

    private void fixArrayMapIssue() {
            try {
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
                    Field mBaseCacheSize = ArrayMap.class.getDeclaredField("mBaseCacheSize");
                    mBaseCacheSize.setAccessible(true);
                    mBaseCacheSize.set(null, 100);

                    Field mTwiceBaseCacheSize = ArrayMap.class.getDeclaredField("mTwiceBaseCacheSize");
                    mTwiceBaseCacheSize.setAccessible(true);
                    mTwiceBaseCacheSize.set(null, 100);
                }
            } catch (Throwable e) {
                e.printStackTrace();
            }
    }

应用onCreate时运行上述方法

【讨论】:

    猜你喜欢
    • 2013-07-25
    • 2021-08-04
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多