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

标签 android database performance android-intent android-activity

我刚开始一份新工作,正在开发一个需要在应用程序周围传递大量数据集的应用程序。目前,该应用程序使用持久存储并不断查询 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/

相关文章:

android - 如何为 Android Imagebutton 设置 20% alpha 值?

java - 错误: incompatible types: <anonymous OnTabSelectedListener> cannot be converted to BaseOnTabSelectedListener

PHP Session Var 不跨页面传输

c++ - 我应该如何从循环中跳出?

android - 整个应用程序中的全局 "search function"

android - 尝试建立APK时发生错误

sql - 具有许多空值的表与 2 个单独的表

c - 使用 c 从 sqlite 中检索数据

java - 如何提高 Netbeans 的性能?

c++ - 特征表达式模板比指数的手动循环慢