我搜索了许多SO问题,他们已经过时了,无法在docs.oracle.com上找到更好的解决方案,我不想转换每个 StringBuilder to string传递字符串数组以便如何实现呢?
答案 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对象中;但是,我不推荐这个,因为:
postSticky
和removeStickyEvent
命令之间“全局”存储,因此只要这些活动执行就会收集垃圾。