簡體   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