我刚开始一项新工作,正在开发一个应用程序,需要在应用程序周围传递大数据集。目前,该应用程序使用持久存储,并不断查询SQL数据库,以获取并向用户显示这些大数据集。由于所有这些昂贵的操作,应用程序几乎无法使用(对于耗时太长的操作,加载的微调器太多)。我的解决方案是在启动主活动时加载数据,然后根据需要将其传递给任何新活动。
我用一个数据集实现了这个更改的第一个阶段。但是,当我试图传递包含intent的extras包中所有这些数据的arraylist时,出现了以下错误:

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 bundle发送太多数据造成的。
我有两个问题。
首先,我的评估听起来正确吗?在过去的四年里,我还没有找到任何明确声明extras bundle有大小限制的东西(2012年和之前都有很多)。
假设我是正确的,我计划使用一个单例来存储太大而无法作为意图传递的数据集,然后执行必要的检查,以确保它在活动生命周期中正常工作(如果活动被破坏并且我丢失了数据,则从数据库重新加载)。还有其他建议吗?我知道这不是最好的做法,但我想不出更好的办法来做。
我还应该提到,由于应用程序的可用性要求,增量加载数据不是一个选项。

最佳答案

是的,有一个限制,但是没有很好的文件证明它有多大或多小。
参阅:Max size of string data that can be passed in intents
有人说,你不应该试图传递任何大于90kb到意图额外。所以限制似乎相当严格。
您的选择:
将数据存储在任何易于读取的临时文件中,并将文件指针传递给该文件。
将数据存储在应用程序的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();

07-25 21:31
查看更多