如何广播意图中的可包裹物体?

贝格迈斯特

我是Java / Android的新手,正在尝试开发与USB CAN总线适配器通信的adroid应用程序。我通过CANBusController类以字符串形式接收来自适配器的消息,并建立了一个可打包的类CANMessage,该类将收到的字符串转换为我可以使用的形式(int Id,int Length,byte []数据)。现在,我试图显示我收到的消息。我有一个片段,CANBusControlFragment,它声明了BroadcastReceiver。收到消息后,我将构建我的CANMessage,将其及其字符串放入一个包中,将该包放入一个Intent中,然后使用sendBroadcast(intent):

CANBusController
{
    public void handleMessage(Message msg)
    {
        Bundle bundle = msg.getData();
        CANMessage canMsg = bundle.getParcelable("CAN_MESSAGE");
        if (canMsg != null)
        {
            Intent intent = new Intent();
            intent.setAction(BroadcastActions.CAN_MESSAGE_RECEIVED);
            //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra("CAN_MESSAGE", canMsg);
            intent.putExtra("STRING_MESSAGE", canMsg.toString());
            parentContext.sendBroadcast(intent);
        }
    }
}

CANBusControlFragment extends Fragment
{
    private final BroadcastReceiver canMsgReceiver = new BroadcastReceiver()
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            String action = intent.getAction();
            Bundle bundle = intent.getExtras();
            try
            {
                if (BroadcastActions.CAN_MESSAGE_RECEIVED.equals(action))
                {
                    synchronized(this)
                    {
                        String str = bundle.getString("STRING_MESSAGE"); // <-- Crash
                        CANMessage canMsg = bundle.getParcelable("CAN_MESSAGE"); // 
                        Append(str);
                        Append(canMsg.toString();
                    }
                }
            }
            catch (Exception ex)
                print exception
        }
    }
}

如果将CANMessage添加到包中,当我尝试getString或getParcelable时,我的应用程序将在BroadcastReceiver的onReceived方法中崩溃,并出现Null指针异常。如果我不包括CANMessage,则该应用程序将正常运行。我相信CANMessage可以正确实现Parcelable,因为我已经通过执行所有相同的步骤(广播消息除外)对其进行了测试:构建CANMessage,在Bundle中放置putParcelable,在Intent中放置Bundle,从Intent中获取Bundle,从中获取getParcelable束。

感谢您的帮助。谢谢 :)

编辑-LogCat信息:看来错误在我的包裹方法中。尝试readByteArray(byte [])会使应用程序崩溃。

11-12 09:17:44.568: E/AndroidRuntime(3087): FATAL EXCEPTION: main

11-12 09:17:44.568: E/AndroidRuntime(3087): java.lang.RuntimeException: Error receiving broadcast Intent { act=com.sb2tablet.CAN_MESSAGE_RECEIVED flg=0x10000010 (has extras) } in com.sb2tablet.CANBusControlFragment$1@9e8f6e00
11-12 09:17:44.568: E/AndroidRuntime(3087):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:768)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at android.os.Handler.handleCallback(Handler.java:725)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at android.os.Looper.loop(Looper.java:137)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at android.app.ActivityThread.main(ActivityThread.java:5041)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at java.lang.reflect.Method.invokeNative(Native Method)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at java.lang.reflect.Method.invoke(Method.java:511)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at dalvik.system.NativeStart.main(Native Method)
11-12 09:17:44.568: E/AndroidRuntime(3087): Caused by: java.lang.NullPointerException
11-12 09:17:44.568: E/AndroidRuntime(3087):     at android.os.Parcel.readByteArray(Parcel.java:1594)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at com.sb2tablet.models.CANMessage.<init>(CANMessage.java:93)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at com.sb2tablet.models.CANMessage$1.createFromParcel(CANMessage.java:18)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at com.sb2tablet.models.CANMessage$1.createFromParcel(CANMessage.java:1)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at android.os.Parcel.readParcelable(Parcel.java:2103)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at android.os.Parcel.readValue(Parcel.java:1965)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at android.os.Parcel.readMapInternal(Parcel.java:2226)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at android.os.Bundle.unparcel(Bundle.java:223)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at android.os.Bundle.containsKey(Bundle.java:271)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at android.content.Intent.hasExtra(Intent.java:4121)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at com.sb2tablet.CANBusControlFragment$1.onReceive(CANBusControlFragment.java:51)
11-12 09:17:44.568: E/AndroidRuntime(3087):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:758)

编辑-writeToParcel和宗地在:

public void writeToParcel(Parcel out, int flags)
{
    out.writeValue(id);    // int
    out.writeValue(len);   // int
    out.writevalue(data);  // byteArray, the value is not null here
    //out.writeByArray(data);
}

public CANMessage(Parcel in)
{
    id = in.readInt();
    len = in.readInt();
    in.readByteArray(data); // Actual crash is here
}

编辑-测试用例1-似乎额外的数据已添加到我的包裹中,我不确定如何添加。

public void writeToParcel(Parcel out, int flags)
{
    out.writeValue(id);    // int = 256
    out.writeValue(len);   // int = 2, length of byte array
    out.writevalue(data);  // byte array = { 17, 51 }
}

public CANMessage(Parcel in)
{
    len = in.readInt();        // 1
    id = in.readInt();         // 256
    len = in.readInt();        // 1
    len = in.readInt();        // 2
    int i = in.readInt();      // 13
    if (data == null) data = new byte[len];
    in.readByteArray(data);    // data = { 17, 51 }
}

编辑-测试用例2

public void writeToParcel(Parcel out, int flags)
{
    out.writeValue(id);       // int = 256
    out.writeValue(len);      // int = 2, length of byte array
    out.writeByteArray(data); // byte array = { 17, 51 }
}

public CANMessage(Parcel in)
{
    len = in.readInt();        // 1
    id = in.readInt();         // 256
    len = in.readInt();        // 1
    len = in.readInt();        // 2
    len = in.readInt();        // 2
    if (data == null) data = new byte[len];
    // in.readByteArray(data); // Crashes
    int i = in.readInt();      // 13073 = 0x3311 = byte[] { 17, 51 }
}
大卫·水

读取字节数组时,您需要事先分配(至少)正确大小的字节数组。像这样:

byte[] blah = new byte[100];
in.readByteArray(blah);

此外,您也不想使用writeValue()将原语写入Parcel使用适当的方法。例:

out.writeInt(id);    // int = 256
out.writeInt(len);   // int = 2, length of byte array
out.writeByteArray(data);  // byte array = { 17, 51 }

您必须始终将宗地上的write()方法与相同类型的read()方法配对例如,如果您习惯writeValue()将内容写入,则必须使用进行Parcel阅读readValue()如果知道变量是an int,则应使用编写并使用writeInt()读取readInt()如果使用编写writeValue()对象,则对象的“类型”也会写入,Parcel以便readValue()知道该对象是什么类型。这就是为什么您在中看到额外的数据的原因Parcel

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何正确测试可包裹物体?

来自分类Dev

可包裹物体的循环参考

来自分类Dev

如何从意图中检索“可拆分”数据?

来自分类Dev

通过包裹传递的可包裹物体是否与原始包裹相同?

来自分类Dev

在意图之间传递可包裹对象

来自分类Dev

使用意图传递可包裹对象时出错

来自分类Dev

Android-广播意图中的自定义操作

来自分类Dev

如何从意图中读“额外”?

来自分类Dev

射线广播穿过物体

来自分类Dev

如何在挂起的意图中设置两个意图

来自分类Dev

如何在意图中传递uuid?

来自分类Dev

如何从待定意图中获得额外收益?

来自分类Dev

如何在类图中定义活动意图

来自分类Dev

如何从意图中获取选定的单选按钮?

来自分类Dev

如何修复在Android中接收广播意图时出错

来自分类Dev

如何通过ADB Shell广播带有附加内容的意图?

来自分类Dev

如何创建可包裹物品的二维可包裹物品数组?

来自分类Dev

当两个意图导致相同的活动时,如何从特定意图中检索额外的意图

来自分类Dev

如何向包裹写入可序列化(不可包裹)列表

来自分类Dev

广播INSTALL_REFERRER意图

来自分类Dev

广播意图不起作用?

来自分类Dev

广播意图不起作用?

来自分类Dev

如何从列表视图中获取广播组的值?

来自分类Dev

如何在意图中定义构造函数

来自分类Dev

如何直接从意图中打开字体大小设置?

来自分类Dev

如何以uri的形式从意图中获取数据?

来自分类Dev

您如何从Kotlin的内容意图中获取uri数据?

来自分类Dev

如何在列表视图中显示意图数据?

来自分类Dev

如何在Android中从意图中添加和检索数据

Related 相关文章

热门标签

归档