2014-02-18 62 views
0

我使用setArgument()/ getArgument()將數據從一個片段傳遞到另一個片段。Android Bundle是共享內存?

我使用Bundle.putParcelableArrayList(), 將ArrayList存儲到包中,並且我創建了它們 - 將數據放入並獲取數據 - 在內存上相等。

一般來說,我認爲,可再生源和再生(通過CREATOR)實例是另一個實例,但它們是相同的。

如果Bundle共享內存,爲什麼bundle有幾種支持多種數據類型的方法 - 爲什麼不只是傳遞Object實例或在Bundle上使用泛型?

回答

0

爲什麼bundle有幾種支持多種數據類型的方法 - 爲什麼不只是傳遞Object實例或在Bundle上使用泛型?

如果Bundle類只有1個方法通過objects,那將是可怕的,因爲這可能會導致混淆。這些多種數據類型方法可以幫助程序員確定他/她想要得到或想要的論點類型,想象一下這種情況,其中4名程序員正在進行一個項目,1名程序員想要將一個對象放在Bundle實例中(在此例如想象,包類只有1方法把對象(多態性))

Bundle bundle = new Bundle(); 
bundle.putObject("animal",new Dog()); 

再後來的程序員的一個希望得到的是價值,做到這一點:

Bundle bundle = getArguments(); 
Cat variable = bundle.getObject("animal"); //This will cause an Exception, because the  argument it returned isn't a Cat class. 

這就是爲什麼Bundle類有這些方法,以避免這種錯誤。

現在,下一個答案是對

或使用通用的包?

泛型是爲了避免使用Casting,並幫助程序員使用Collection Framework來避免上述類型的問題。

0
public final class Bundle implements Parcelable, Cloneable {...} 

捆綁實現Parcelable,系統會自動確定是否包是一個跨進程和跨進程,如果它不是,則該數據是通過共享存儲器直接傳遞,所以這個時候傳遞與對象獲得的對象實際上是相同的,但是如果是跨進程,Parcelable接口在跨進程中起作用,系統會調用Parcelable的writeToParcel方法,將所有數據都轉換爲字節,然後傳遞給其他進程,其他進程接收完畢後,再通過Parcelable Creator接口恢復數據,通過Creator恢復數據肯定不是同一個實例。至於爲什麼Bundle有這麼多的方法,而不是直接使用putObject(Object),getObject(),部分是因爲Parcelable是必需的,並不是每個類型都可以包裹,然後Bundle自實現Parcelable以來,也必須是他需要傳遞捆綁數據要求也支持包裹