如何在不同活动之间传递StringBuilder数组?

3

我在许多SO问题上进行了搜索,但它们都太旧了,在docs.oracle.com上也找不到更好的解决方案。我不想将每个StringBuilder转换为字符串来传递字符串数组,那么如何实现?


将它们设为静态变量是可行的选择吗? - Roberto Anić Banić
完全不可以,静态变量可以从其他类中进行查看和编辑,我不想允许这种情况。 - Zulqurnain Jutt
顺便提一下,您知道如果将它们设置为静态变量,只有编写应用程序的人才能真正使其他类访问该变量。除此之外,如果不对对象进行序列化或打包处理,就没有其他方法可以实现您想要的功能! - Roberto Anić Banić
根据 java文档, StringBuilder 实现了 Serializable 接口,因此我认为它是可以的,但是我尝试过传递可序列化对象,但结果不尽如人意。 - Zulqurnain Jutt
@BadComputer 我强烈建议使用 EventBus 来处理这个问题。请看我的回答以了解如何使用。 - bcorso
4个回答

2

从源Activity内部:

Intent intent = new Intent(this, DestActivity.class);
intent.putCharSequenceArrayListExtra("strings", myStringBuilders);
startActivity(intent);

你可能需要执行类似于 new ArrayList(Arrays.asList(myStringBuilders)); 这样的操作。

基本上,stringBuilder 包含非常大的数据,转换它不是一个可行的选项,如果我转换了,我必须在接收端再次转换为 stringBuilder,所以这个选项已经被排除了。 - Zulqurnain Jutt
如果确实很大,那么您应该只需创建一个包本地静态类变量(最好不要在Activity上)。 - Jacob Phillips
你能否完整回答上面的问题?在接收端,我需要尝试并检查。将其设置为静态变量是最后的选择,但我没有想到传递一个高级字符串类(如StringBuilder)会那么复杂? - Zulqurnain Jutt

0
将其转换为集合,然后通过意图传递,最后再将其转换回数组。

0

要传递一个 StringBuilder 数组,您可以使用 Intent 的 putExtra 方法,像这样:

Intent it = new Intent(this, YourActivity.class);
            StringBuilder[] sbAr = new StringBuilder[4];
            sbAr[0] = new StringBuilder("Array0");
            sbAr[1] = new StringBuilder("Array1");
            it.putExtra("sbParam", sbAr);

然而,我不知道为什么当您检索活动目标中的值时,StringBuilder数组会恢复为CharSequence数组。

CharSequence[] csA = (CharSequence[]) getIntent().getExtras().get("sbParam");

希望这能有所帮助


0

在不使用捆绑的情况下传递对象最好的方法是使用事件总线(我推荐greenrobot/EventBus)。

事件总线可以比捆绑快得多。请参见this article

我唯一能看到的缺点是,如果由于低内存而销毁 Activity/进程,则在重新创建时将丢失数据;而如果将数据存储在 bundle 中,则在重新创建 Activity 时将重新提供 bundle(可能在这里有误)。


操作步骤如下:

创建一个POJO来存储事件的StringBuilder

public class SaveStringBuilderEvent {
    public StringBuilder sb;
    public SaveStringBuilderEvent(StringBuilder sb){ this.sb = sb; }
}

创建第一个Activity,在启动下一个Activity之前发布一个StickyEvent('StickyEvent'将保留最后一个事件的内存,直到手动删除它):
public class Activity1 extends Activity {
    private StringBuilder sb;
    ...

    // Function for loading the next activity
    private void loadNextActivity(){
       EventBus.getDefault().postSticky(new SaveStringBuilderEvent(sb));
       Intent intent = new Intent(this, Activity2.class);
       startActivity(intent);
    }

    ...
}

创建第二个活动并从EventBus中删除粘性事件:
public class Activity2 extends Activity {
    StringBuilder sb = EventBus.getDefault()
                           .removeStickyEvent(SaveStringBuilderEvent.class)
                           .sb;
}

注意:

个人认为这是处理不想捆绑对象的情况最合适的方式,但还有两种不太理想的方法来在 Activity 生命周期之间保持对象状态 - 您可以将 StringBuilder 存储在 Application 类中或单例对象中;然而,我不建议这样做,因为:

  1. 如果您将其存储在 Application 类中,则将从所有 Activity 中读取变量到 Application 中。
  2. 此外,由于 Application/Singleton 具有全局范围,您必须确保将变量设置为 null,以便它可以被垃圾回收,否则它将在整个应用程序的生命周期内保留,浪费内存。但是,使用 eventBus,变量仅在 postStickyremoveStickyEvent 命令之间“全局”存储,因此只要这些 Activity 进行垃圾回收,它就会被垃圾回收。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接