繁体   English   中英

如何将StringBuilder数组从一个Activity传递到另一个Activity?

[英]How to pass StringBuilder Array from one Activity to another?

我搜索了很多SO问题,它们已经老了,在docs.oracle.com上找不到更好的解决方案,我不想将每个StringBuilder转换成字符串来传递一个字符串数组,那么如何实现呢?

从源内部活动:

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

您可能需要执行类似new ArrayList(Arrays.asList(myStringBuilders));

将其转换为集合,然后将其传递给intent,然后将其转换回Array。

要传递一个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");

我希望这有帮助

我看到在没有捆绑的情况下传递对象的最好方法是使用EventBus(我推荐greenrobot / EventBus )。

EventBus可以比捆绑快得多。 看到这篇文章

我能看到的唯一不利的一面是,如果你的Activity /进程由于内存不足而被破坏,它将在重新创建时丢失数据; 然而,如果您将数据存储在一个包中,那么该包将在重新创建时重新提供给Activity(这里可能是错误的)。


以下是它的完成方式:

创建一个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中删除stick事件:

public class Activity2 extends Activity {
    StringBuilder sb = EventBus.getDefault()
                           .removeStickyEvent(SaveStringBuilderEvent.class)
                           .sb;
}

注意:

我个人认为这是处理这种情况的最合适的方法,你不想捆绑一个对象,但是还有另外两种不太理想的方法来维护Activity生命周期之间的对象状态 - 你可以将StringBuilder存储在Application类或Singleton对象中; 但是,我不建议这样做,因为:

  1. 如果将它存储在Application类中,则将所有活动中的变量升入应用程序。
  2. 此外,由于Application / Singleton具有全局范围,因此您必须确保将变量置零,以便它可以收集垃圾,或者它会在应用程序的整个生命周期内停留,只会浪费内存。 但是,使用eventBus,变量仅在postStickyremoveStickyEvent命令之间“全局”存储,因此只要这些活动执行就会收集垃圾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM