从 Fragment 移动到 Activity 导致 android.os.TransactionTooLargeException

Posted

技术标签:

【中文标题】从 Fragment 移动到 Activity 导致 android.os.TransactionTooLargeException【英文标题】:Move from Fragment to Activity Causes android.os.TransactionTooLargeException 【发布时间】:2021-12-14 12:51:27 【问题描述】:

我正在尝试使用 Intents 从 Fragment 移动到 Activity,并且在我运行代码的地方,它会导致 android.os.TransactionTooLargeException

我的片段代码(CardFragment.java):

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) 
    super.onViewCreated(view, savedInstanceState);

    txtName = view.findViewById(R.id.txt_name);
    btnFood = view.findViewById(R.id.btn_food);

    txtName.setText(mName);

    Bitmap bm = StringToBitMap(mImage);
    btnFood.setImageBitmap(bm);

    btnFood.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            Intent intent = new Intent(getActivity(), Recipes.class);
            intent.putExtra("Name", mName);
            intent.putExtra("Recipe", mRecipe);
            intent.putExtra("Image", mImage);
            startActivity(intent);
        
    );

mNamemRecipemImage 是字符串变量。

我的活动代码(Recipes.java):

public class Recipes extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recipes);

        TextView txtName = findViewById(R.id.txt_name);
        TextView txtRecipe = findViewById(R.id.txt_recipe);
        ImageView imgView = findViewById(R.id.img_view);

        txtName.setText(getIntent().getStringExtra("Name"));
        txtRecipe.setText(getIntent().getStringExtra("Recipe"));

        Bitmap bm = CardFragment.StringToBitMap(getIntent().getStringExtra("Image"));
        imgView.setImageBitmap(bm);
    

每次运行此代码时,都会收到以下错误消息:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.company.recipeapp, PID: 12160
    java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 2355168 bytes
        at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:161)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: android.os.TransactionTooLargeException: data parcel size 2355168 bytes
        at android.os.BinderProxy.transactNative(Native Method)
        at android.os.BinderProxy.transact(BinderProxy.java:540)
        at android.app.IActivityTaskManager$Stub$Proxy.activityStopped(IActivityTaskManager.java:4408)
        at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:145)
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7656) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 

这是什么错误,我该如何解决?也许是因为在我之前的视图中有多个CardFragments?感谢您的帮助。

【问题讨论】:

这能回答你的问题吗? TransactionTooLargeException on API 28+ when sharing bitmap despite using Intent.EXTRA_STREAM 将标识符作为额外值而不是当前值传递。让其他活动使用该标识符来获取所需的数据,例如从存储库单例中检索它。或者,也许您不需要该屏幕的单独 Activity,它可以是原始 Activity 中的另一个片段。 貌似mImage可能不是String,而是比较大的位图。 【参考方案1】:

此错误表示您通过 Intent 发送了超过 1 MB 的数据,在这种情况下,您的位图对于 Intent 来说太大了。

解决方案是减小位图大小或使用不同的方式传递位图之类的服务等。

【讨论】:

以上是关于从 Fragment 移动到 Activity 导致 android.os.TransactionTooLargeException的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ViewPager 中从 Activity 移动到 Fragment?未找到片段 ID 的视图

如何从 Main Activity 到 Fragment,并从同一个 Fragment 返回到 Main Activity?

如何从一个activity中跳转到一个fragment

从 Activity 导航到 Fragment 并返回到 Activity 导致该 Activity 被多次创建

将数据从 Fragment Activity 传输到 Fragment

从 Fragment 到 Activity 的意图