簡體   English   中英

使用Intent將對象從一個活動傳遞到另一個活動時會出現什么問題

[英]What are the problems in using Intent to pass objects from one activity to another

更新:請參閱下面的“已接受”解決方案
我觀察到的一種方法是意圖。 沒有其他適當的推薦方法。

對我來說,當您要通過網絡傳輸數據或需要一段時間后檢索對象時,需要序列化。 僅在某些特定情況下使用。 但是在這里,我看到的是將意圖與序列化一起使用,以簡單地共享/傳遞一些數據。

根據規范,意圖將充當活動之間的粘合劑。 我還假設我們可以將指令/少量數據傳遞給下一個活動。

我的問題更具體地說是關於使用意圖傳遞數據/大數據。 考慮到使用意圖時需要序列化。 這是個好方法嗎?

注意:請注意,由於開發了獨立於android的框架,因此在此特定情況下將無法使用Parcelable。

Intents只能傳遞小數據包。 如果您需要傳遞一些大的東西,請將其保存到存儲或數據庫中,請通過Intent傳遞一個uri,然后在接收Activity讀取數據。

故意傳遞大數據將導致嚴重的問題,甚至導致您終止應用程序進程(這對用戶來說非常煩人)。

組件之間傳遞的數據范圍限制為1MB 請記住,這並不意味着您可以安全地傳遞1MB的數據,因為一次可能要處理多個Intents

您也可以考慮使用事件總線庫,例如greenrobot EventBus ,但是它們需要大量的訓練,因為它們基本上可以使您將所有內容傳遞給任何地方。

意圖附加功能確實是常見的方式。 這取決於您的數據類型-基本類型不需要任何大小的特殊工作,並且自定義模型應該捆綁在一個Parcelable對象中(想不出為什么它不能成為一種選擇)。 如果您要緩存一些大數據(例如大圖片),則應考慮將它們臨時存儲在SD卡上(作為文件或本地SQLite),但這仍然是您要走的路。 盡量避免額外使用網絡,並且不要在遠程服務器上緩存此數據。

EventBus是另一種特別適合與其他類型的上下文(服務,廣播接收器)進行通信的方法

我使用的一種方法是對數據對象使用Singleton Holder類。 並在流程的各個組件之間進行訪問。 偽代碼在下面。 可能有編譯錯誤。 另外請注意,您將需要清除機制並添加一種方法來保持數據新鮮。

class DataSet{
    DataSet(String data){
        this.data = data;
    }
    public String data;
}

class Holder{
    private Holder(){
    }
    private static Holder holder = null;
    DataSet object = null;

    private Holder  static getInstance(){
        if(null == holder){
            holder = new Holder();
        }
        return holder
    }

    public void setData(DataSet arg){
        object = arg;
    }

    public DataSet getData(){
        return object;
    }

   }


class Activity A implements View.OnClickListener{
    public void onClick(){
        Holder.getInstance().setData(new DataSet("this is a big object"));
// At this point the data has been set and has process scope.
            startActivity(new Intent(A.this, B.class))
        }

}

class Activity B{
    DataSet data;
    public void onCreate(){
        data = Holder.getInstance().getData(); // This point the data is accessible to Class B
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM