【问题标题】:Pass large string-arrays to another Activity将大字符串数组传递给另一个活动
【发布时间】:2014-08-05 17:11:45
【问题描述】:

我正在尝试将可能 2 或 3 MB 的大型字符串数组传递给另一个活动。该块没有通过,我在 logcat 中唯一能看到的关于发生的事情是......

!!! Binder 交易失败!!!

我尝试创建自己的实现 Serializable 的类,在其中放置了我的 String 的 mutator,然后将 Object 引用传递给 intent.putExtra(key, Serializable obj)

代码:

MyClass mc = new MyClass();

Intent intent = new Intent(MainActivity.this, CalculationsActivity.class); 
intent.putExtra("mc", mc);

这个问题有没有简单的解决方案——将一个大的字符串数组传递给另一个活动?

class MyClass implements Serializable {
   private String[] str;

   public void setString(String[] str) {
       this.str = str;  
   }

   public String[] getString() {
       return this.str;
   }
}

我认为只传递一个引用不会导致这种情况。引用不超过内存地址

【问题讨论】:

  • 在意图包中可以传递的内容的大小是有限制的。超过该限制会导致您描述的错误。我在某些设备上观察到它约为 500K,尽管我不知道这是否是一个系统值。解决方案包括使用静态变量、文件或数据库写入、重新考虑是否真的需要传递 2M 的数据。
  • 您尝试将 3MB String[] 传递给另一个 Activity 似乎很奇怪。我认为,如果您首先解释您要尝试做什么,我们可能会找到一个更简单的解决方案。
  • @njzk2 - 你好,我这样做的原因是因为我希望在应用程序启动时下载繁重的文本文件。 3-4 秒后,用户来到第一个活动 - 一个 GUI,她/他可以在其中选择不同的选项。从此所有繁重的加载都完成了-我想避免以后在应用程序中加载。谢谢
  • 我会将文件保存在文件系统上,并在意图中简单地传递路径。
  • @user3155478 闪屏很糟糕。不要使用一个。这是应用程序设计不良的标志,并且违反了 Google 的应用程序设计指南。如果您的应用程序需要在启动时加载数据而不是您做错了什么。而且,如果您不需要在启动时加载数据,那么就没有理由使用 Splashscreen 并让用户等待。像这样的事情可以决定或破坏您的应用程序的用户参与度。如果每次启动都必须等待 5 秒,那么没有人会继续使用您的应用程序。这只会惹恼用户。

标签: android android-intent android-activity arrays


【解决方案1】:

正如其他人所说,使用本地文件(在您的沙盒目录中)或数据库条目可能是要走的路。但是,如果您想远程(例如 ftp)托管文件并在应用程序加载时仍然加载它们,您应该使用服务。 (见Docs)。

我之前有两个答案更深入地解释了您应该查看的服务。

How to use threads and services. AndroidAndroid Service with multiple Threads

基本上有两种类型,绑定线程(与活动或应用程序一起存在)和意图服务(可以始终处于活动状态,或仅在应用程序打开时处于活动状态)。您想要的可能是前者,它看起来类似于第一个链接中的内容。

这是一个sn-p

public class BoundService extends Service {
    private final BackgroundBinder _binder = new BackgroundBinder();

    //Binding to the Application context means that it will be destroyed (unbound) with the app
    public IBinder onBind(Intent intent) {
        return _binder;
    }

    //TODO: create your methods that you need here (or link actTwo)
    // Making sure to call it on a separate thread with AsyncTask or Thread

    public class BackgroundBinder extends Binder {
        public BoundService getService() {
            return BoundService.this;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2017-05-26
    相关资源
    最近更新 更多