获取数据时,Android捆绑ArrayOutOfBoundException

时间:2019-06-20 13:55:15

标签: android android-bundle

我正在使用捆绑软件在线程之间传递数据。
 有时,当我尝试读取数据包时,出现了ArrayIndexOutOfBoundsException:

java.lang.ArrayIndexOutOfBoundsException: length=0; index=4
        at android.util.ArrayMap.indexOf(ArrayMap.java:110)
        at android.util.ArrayMap.indexOfKey(ArrayMap.java:339)
        at android.util.ArrayMap.get(ArrayMap.java:381)
        at android.os.BaseBundle.getByte(BaseBundle.java:693)
        at android.os.Bundle.getByte(Bundle.java:579)
        at android.os.BaseBundle.getByte(BaseBundle.java:680)
        at android.os.Bundle.getByte(Bundle.java:566)
        at com.online.libcommunication.net.ThreadD.handleMessage(ThreadD.java:425)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:135)
        at android.os.HandlerThread.run(HandlerThread.java:61)

触发异常的代码是:

    @Override
    public boolean handleMessage(Message msg) {
        if(!this.isAlive()) {
            return false;
        }

        switch (msg.what)
        {
            case ThreadMessages.MSG_CMD : 
                bundle = msg.getData();
                byte modecmd = bundle.getByte("mode", (byte) 127); // <-- This is the line causing the exception
                // ...
                return true;
        }
    }

这就是在另一个线程上创建捆绑包的方式:

public void sendCommand(Bundle bundle,DPO dpo)
    {
        Message msg = mPHandler.obtainMessage();
        msg.what = ThreadMessages.MSG_CMD;
        msg.obj = dpo;
        msg.setData(bundle);
        mPHandler.sendMessage(msg);
    }

    bc.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
                mCmdBundle.clear();
                mCmdBundle.putByte("mode", (byte) 6);
                // + Other datas
                mActivity.getController().sendCommand(mCmdBundle, mDPO);
        }
    });

我不太了解发生了什么,这就像捆绑包中的getX方法没有找到关联的键并抛出异常而不是默认值一样。 异常也随机发生,有时工作正常。

我可以简单地将所有内容包装在try / catch中,但我宁愿了解问题的根源。

有什么想法吗?

编辑:在Android 5.1.1上运行

2 个答案:

答案 0 :(得分:0)

对您的问题进行调查后,发现这种情况并不常见。

我发现了这一点:Google bug位于android.util.ContainerHelpers.binarySearch

Google表示他们已在Android 5.1中修复了此问题。

但是在较新版本中也有类似的情况。

可能与之相关。我希望这会有所帮助。

答案 1 :(得分:0)

尝试在获取值之前检查捆绑软件是否包含键“模式”。似乎是Bundle ArrayMap中的错误