我在许多SO问题上进行了搜索,但它们都太旧了,在docs.oracle.com上也找不到更好的解决方案。我不想将每个StringBuilder转换为字符串来传递字符串数组,那么如何实现?
我在许多SO问题上进行了搜索,但它们都太旧了,在docs.oracle.com上也找不到更好的解决方案。我不想将每个StringBuilder转换为字符串来传递字符串数组,那么如何实现?
从源Activity内部:
Intent intent = new Intent(this, DestActivity.class);
intent.putCharSequenceArrayListExtra("strings", myStringBuilders);
startActivity(intent);
new ArrayList(Arrays.asList(myStringBuilders));
这样的操作。要传递一个 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");
希望这能有所帮助
在不使用捆绑的情况下传递对象最好的方法是使用事件总线(我推荐greenrobot/EventBus)。
事件总线可以比捆绑快得多。请参见this article。
我唯一能看到的缺点是,如果由于低内存而销毁 Activity/进程,则在重新创建时将丢失数据;而如果将数据存储在 bundle 中,则在重新创建 Activity 时将重新提供 bundle(可能在这里有误)。
创建一个POJO来存储事件的StringBuilder
:
public class SaveStringBuilderEvent {
public StringBuilder sb;
public SaveStringBuilderEvent(StringBuilder sb){ this.sb = sb; }
}
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);
}
...
}
public class Activity2 extends Activity {
StringBuilder sb = EventBus.getDefault()
.removeStickyEvent(SaveStringBuilderEvent.class)
.sb;
}
个人认为这是处理不想捆绑对象的情况最合适的方式,但还有两种不太理想的方法来在 Activity 生命周期之间保持对象状态 - 您可以将 StringBuilder 存储在 Application
类中或单例对象中;然而,我不建议这样做,因为:
postSticky
和 removeStickyEvent
命令之间“全局”存储,因此只要这些 Activity 进行垃圾回收,它就会被垃圾回收。