Android 在活动之间传递字节[]应用程序崩溃,但在片段之间传递相同的字节[]效果良好

Android 在活动之间传递字节[]应用程序崩溃,但在片段之间传递相同的字节[]效果良好,android,arrays,android-intent,android-activity,Android,Arrays,Android Intent,Android Activity,我有一张图片,我想在另一个活动的片段上显示这张图片。我在活动应用程序崩溃之间传递一个字节[],但在片段之间传递相同的字节[]。它工作正常,logcat中的所有错误都被删除 我正在Activity1中使用此代码 Intent intent = new Intent(getActivity(), Main2Activity.class); Bundle bundle = new Bundle(); bundle.putByteArray("imgByte", imgByte);

我有一张图片,我想在另一个活动的片段上显示这张图片。我在活动应用程序崩溃之间传递一个字节[],但在片段之间传递相同的字节[]。它工作正常,logcat中的所有错误都被删除

我正在Activity1中使用此代码

 Intent intent = new Intent(getActivity(), Main2Activity.class);
    Bundle bundle = new Bundle();
    bundle.putByteArray("imgByte", imgByte);
    bundle.putString("ItemID", ItemID);
    bundle.putString("ShopID", ShopID);
    bundle.putString("odertime", ordertiming);
    bundle.putString("cat_name", "show_offer_details");

    intent.putExtras(bundle);


    startActivity(intent);
为了在Activity2中实现这个目的,我在Activity2中有一个片段,我想在这里显示这个字节[]

 Bundle bundle = getIntent().getExtras();

    if (bundle != null) {

        cat_name = bundle.getString("cat_name");
        imgByte = bundle.getByteArray("imgByte");
        ShopID = bundle.getString("ShopID");
        ItemID = bundle.getString("ItemID");
        ordertiming = bundle.getString("ordertiming");
        bundle.clear();

    }
为了传递Activity2的片段,我使用了以下代码

 FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        details details = new details ();


        Bundle args = new Bundle();
        args.putByteArray("imgByte", imgByte);
        args.putString("ItemID", ItemID);
        args.putString("ShopID", ShopID);
        args.putString("odertime", ordertiming);

        details .setArguments(args);

        fragmentTransaction.replace(R.id.cat_container, details , "details ");
        fragmentTransaction.commit();
但是它崩溃了,所有的错误都在logcat中被删除了

当我在两个片段中传递相同的字节[]时,它工作正常


这种情况有什么解决办法吗

在两个片段之间传递数据完全发生在您自己的进程中

通过
Intent
extra(或
Intent
的其他部分)在两个活动之间传递数据涉及多个过程:

  • 进程与核心操作系统进程之间存在进程间通信(IPC)调用

  • 有一个IPC调用从核心OS进程返回到您的进程

因此,
Intent
上存在大小限制。不要通过
意图在活动之间传递大型内容。取而代之的是:

  • 使用片段,或

  • 使用提供缓存的单一存储库,以便您可以在活动之间传递标识符,第二个活动可以从缓存中检索数据


不将图像作为字节[]传递,而是传递图像的位置。因此,首先我需要将图像保存在手机内存中?这取决于您的要求。你从哪里得到的图像?如果是从远程发送的,则传递URL。它是从服务器发送的,但我不想再次下载它。加载它需要时间。我想将其显示为活动OpenS您应该使用一些好的图像加载程序库,如Glide或Picasso,并使用缓存机制。我使用的是viewHolder.NBY_image_rcw.buildDrawingCache();位图bmap=viewHolder.NBY_image_rcw.getDrawingCache();字节[]imgByte=位映射字节(bmap);然后把它传给另一个activity@sam:使用片段或使用该位图的单一存储库缓存。是否有其他方法传递该位图bitmap@sam:正如我说过的(两次),要么使用片段,要么使用可以(小心地!)缓存位图的单例。或者,如评论中所建议的,使用带有缓存的图像加载器(Glide,Picasso)从服务器获取图像,然后在活动之间传递该图像的URL。或者,将映像写入磁盘并在活动之间传递路径。