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

时间:2015-07-24 01:27:10

标签: java android android-intent android-activity

我搜索了许多SO问题,他们已经过时了,无法在docs.oracle.com上找到更好的解决方案,我不想转换每个 StringBuilder to string传递字符串数组以便如何实现呢?

4 个答案:

答案 0 :(得分:2)

来自源Activity:

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

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

之类的操作

答案 1 :(得分:0)

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

答案 2 :(得分: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");

我希望这会有所帮助

答案 3 :(得分:0)

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

EventBus可以比捆绑快得多。请参阅this article

我能看到的唯一不利的一面是,如果你的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命令之间“全局”存储,因此只要这些活动执行就会收集垃圾。