2

我刚开始一项新工作,正在开发一款应用程序,需要在应用程序周围传递大量数据。目前,该应用程序使用持久性存储,并不断查询SQL数据库以将这些大型数据集提取并显示给用户。由于所有这些昂贵的操作,该应用程序几乎变得无法使用(太多的操作需要太长时间的加载纺纱器)。我的解决方案是在主要活动启动时加载数据,然后根据需要将其传递给任何新活动。通过intents传递大量数据时发生崩溃 - 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 [email protected] (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) 

其中,在此基础上计算器职位:Using Crop intent Getting java.lang.SecurityException: Unable to find app for caller [email protected]以及测试与较小的数据集我发现(几乎可以肯定)是由于通过intent extras bundle发送太多数据而造成的。

我有两个问题。

  1. 首先,我的评估听起来是否正确?过去四年里,我一直无法找到任何明确表示额外套餐有限制的内容(尽管从2012年开始还有很多)。
  2. 假设我是正确的,我打算使用单例来存储太大而不能作为意图传递的数据集,然后执行必要的检查以确保它与活动生命周期一起工作(re如果活动被破坏并且数据丢失,则从数据库加载数据)。还有其他建议吗?我知道这不是最好的做法,但我想不出一个更好的方法来做到这一点。

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

+0

你的日志可能意味着,那就是这样的名字已经存在的ContentProvider,你不能注册一个,或者有一些与你的供应商。虽然它可能会有一些访问内容的缺失权限 –

+0

ArrayList传递需要包裹可执行 – Haroon

+0

我添加的唯一代码是在第一个活动中使用AsyncTaskLoader从数据库加载数据,然后将该数据传递给第二个活动意图。我绝对不会对内容提供商做任何事情。我的猜测是这个日志是指Android系统用来启动一个有意图的数据的日志。 –

回答

5

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

参见: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(); 
+1

是的,我厌倦了使用应用程序实例(这篇博文很好地解释了为什么http://www.developerphil.com/dont-store-data-in-the-application-object/),但是说它可能比使用单身更安全。 –

+0

博客文章中描述的问题是常见的陷阱,但使用单例时也会发生同样的问题。这就是说,一个应用程序实例可能是你最好的机会,如果适当使用。 –

相关问题