gpt4 book ai didi

android - 通过 intents 传递大量数据时崩溃 - extras 包是否有大小限制?

转载 作者:太空宇宙 更新时间:2023-11-03 12:48:35 26 4
gpt4 key购买 nike

我刚开始一份新工作,正在开发一个需要在应用程序周围传递大量数据集的应用程序。目前,该应用程序使用持久存储并不断查询 SQL 数据库以获取并向用户显示这些大型数据集。由于所有这些昂贵的操作,该应用程序几乎变得无法使用(对于花费太长时间的操作,加载旋转器太多)。我的解决方案是在主 Activity 启动时加载数据,然后根据需要将其传递给任何新 Activity 。

我用一个数据集实现了这一变化的第一阶段。但是,当我尝试将 ArrayList 与 Intent 的附加包中的所有这些数据一起传递时,出现以下错误:

04-27 06:42:32.022: E/AndroidRuntime(14180): FATAL EXCEPTION: main
04-27 06:42:32.022: E/AndroidRuntime(14180): Process: com.myprocess, PID: 14180
04-27 06:42:32.022: E/AndroidRuntime(14180): java.lang.SecurityException: Unable to find app for caller android.app.ApplicationThreadProxy@42b32678 (pid=14180) when publishing content providers
04-27 06:42:32.022: E/AndroidRuntime(14180): at android.os.Parcel.readException(Parcel.java:1472)
04-27 06:42:32.022: E/AndroidRuntime(14180): at android.os.Parcel.readException(Parcel.java:1426)
04-27 06:42:32.022: E/AndroidRuntime(14180): at android.app.ActivityManagerProxy.publishContentProviders(ActivityManagerNative.java:2977)
04-27 06:42:32.022: E/AndroidRuntime(14180): at android.app.ActivityThread.installContentProviders(ActivityThread.java:4591)
04-27 06:42:32.022: E/AndroidRuntime(14180): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4522)
04-27 06:42:32.022: E/AndroidRuntime(14180): at android.app.ActivityThread.access$1500(ActivityThread.java:151)
04-27 06:42:32.022: E/AndroidRuntime(14180): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1381)
04-27 06:42:32.022: E/AndroidRuntime(14180): at android.os.Handler.dispatchMessage(Handler.java:110)
04-27 06:42:32.022: E/AndroidRuntime(14180): at android.os.Looper.loop(Looper.java:193)
04-27 06:42:32.022: E/AndroidRuntime(14180): at android.app.ActivityThread.main(ActivityThread.java:5292)
04-27 06:42:32.022: E/AndroidRuntime(14180): at java.lang.reflect.Method.invokeNative(Native Method)
04-27 06:42:32.022: E/AndroidRuntime(14180): at java.lang.reflect.Method.invoke(Method.java:515)
04-27 06:42:32.022: E/AndroidRuntime(14180): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
04-27 06:42:32.022: E/AndroidRuntime(14180): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
04-27 06:42:32.022: E/AndroidRuntime(14180): at dalvik.system.NativeStart.main(Native Method)

其中,基于这篇 stackoverflow 帖子:Using Crop intent Getting java.lang.SecurityException: Unable to find app for caller android.app.ApplicationThreadProxy@4266ae80以及使用较小的数据集进行测试时,我发现(几乎可以肯定)是由于通过 intent extras 包发送过多数据造成的。

我有两个问题。

  1. 首先,我的评估听起来正确吗?在过去的四年里,我一直没能找到任何明确说明额外包有大小限制的内容(虽然有很多是 2012 年及之前的)。
  2. 假设我是正确的,我计划使用单例来存储太大而无法作为 Intent 传递的数据集,然后实现必要的检查以确保它适用于 Activity 生命周期(重新-如果 Activity 被破坏并且我丢失了数据,则从数据库加载)。还有其他建议吗?我知道这不是最佳做法,但我想不出更好的方法。

我还应该提到,由于应用程序的可用性要求,增量加载数据不是一种选择。

最佳答案

是的,有一个限制,但没有很好地记录它有多大或多小。

参见:Max size of string data that can be passed in intents

有人说您不应该尝试将大于 90kb 的任何内容传递到 Intent extras 中。所以限制似乎很紧。

您的选择:

  • 将数据存储在任何易于读取的临时文件中,并将文件指针传递给该文件。
  • 将数据存储在应用的 Application 实例中,不是作为单例,而是通过 (MyAppInstance) context.getApplicationContext() 访问的东西。

最后一个选项的例子:

注意:您可能想要同步对数据的访问。

public class MyAppInstance extends Application {
private Object data = null;

public void setMyData(Object data){
this.data = data;
}

public Object getMyData(){
return data;
}

}

MyAppInstance app = (MyAppInstance) context.getApplicationContext();

app.setMyData(whatever);
whatever = app.getMyData();

关于android - 通过 intents 传递大量数据时崩溃 - extras 包是否有大小限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36909374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com