當前位置:首頁 » 安卓系統 » 安卓開發parcel什麼意思

安卓開發parcel什麼意思

發布時間: 2022-06-07 18:56:23

A. android parcelable序列化怎麼用

一序列化原因:
1.永久性保存對象,保存對象的位元組序列到本地文件中;
2.通過序列化對象在網路中傳遞對象;
3.通過序列化在進程間傳遞對象。

二 至於選取哪種可參考下面的原則:
1.在使用內存的時候,Parcelable 類比Serializable性能高,所以推薦使用Parcelable類。
2.Serializable在序列化的時候會產生大量的臨時變數,從而引起頻繁的GC。
3.Parcelable不能使用在要將數據存儲在磁碟上的情況,因為Parcelable不能很好的保證數據的持續性在外界有變化的情況下。盡管Serializable效率低點, 也不提倡用,但在這種情況下,還是建議你用Serializable 。

實現:
1 Serializable 的實現,只需要繼承 implements Serializable 即可。這只是給對象打了一個標記,系統會自動將其序列化。

2 Parcelabel 的實現,需要在類中添加一個靜態成員變數 CREATOR,這個變數需要繼承 Parcelable.Creator 介面。

public class MyParcelable implements Parcelable {
private int mData;

public int describeContents() {
return 0;
}

public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
}

public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}

public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};

private MyParcelable(Parcel in) {
mData = in.readInt();
}
}

B. android parcel 類函數appendFrom是干什麼用的

一般來說你特意寫了一個Adapter,那麼它與ListView應該是一一對應的,那麼你在初始化Adapter的時候直接將MainActivity作為參數傳遞到Adapater中,並且將其作為Adapter的一個類成員變數,你現在想怎麼調用就怎麼調用了

C. android parcelable newarray有什麼用

參考如下內容:
android中還有一種特有的序列化方法,那就是實現Parcelable介面,使用這種方式來序列化的效率要高於實現Serializable介面。不過Serializable介面實在是太方便了,因此在某些情況下實現這個介面還是非常不錯的選擇。
使用Parcelable步驟:
1.實現Parcelable介面
2.實現介面中的兩個方法
public int describeContents();
public void writeToParcel(Parcel dest, int flags);1212

第一個方法是內容介面描述,默認返回0就可以了
第二個方法是將我們的對象序列化一個Parcel對象,也就是將我們的對象存入Parcel中
3.實例化靜態內部對象CREATOR實現介面Parcelable.Creator,實例化CREATOR時要實現其中的兩個方法,其中createFromParcel的功能就是從Parcel中讀取我們的對象。

D. java android 實現parcelable序列化,為什麼必須要實現CREATOR

你好:
Android序列化對象主要有兩種方法,實現Serializable介面、或者實現Parcelable介面。實現Serializable介面是Java SE本身就支持的,而Parcelable是Android特有的功能,效率比實現Serializable介面高,而且還可以用在IPC中。實現Serializable介面非常簡單,聲明一下就可以了,而實現Parcelable介面稍微復雜一些,但效率更高,推薦用這種方法提高性能。下面就介紹一下實現Parcelable介面的方法
通過實現Parcelable介面序列化對象的步驟:
1、聲明實現介面Parcelable
2、實現Parcelable的方法writeToParcel,將你的對象序列化為一個Parcel對象
3、實例化靜態內部對象CREATOR實現介面Parcelable.Creator:
Java代碼
public static final Parcelable.Creator<T> CREATOR

其中public static final一個都不能少,內部對象CREATOR的名稱也不能改變,必須全部大寫。
4、完成CREATOR的代碼,實現方法createFromParcel,將Parcel對象反序列化為你的對象

簡而言之:通過writeToParcel將你的對象映射成Parcel對象,再通過createFromParcel將Parcel對象映射成你的對象。也可以將Parcel看成是一個流,通過writeToParcel把對象寫到流裡面,在通過createFromParcel從流里讀取對象,只不過這個過程需要你來實現,因此寫的順序和讀的順序必須一致。

Parcel對象可以通過以下方法寫入或讀取byte, double, float, int, long, String這6種類型變數。

E. android開發中跨進程通信有幾種方式

Android進程間通信的幾種方式 定義多進程
第一:Android應用中使用多進程只有一個辦法(用NDK的fork來做除外),就是在AndroidManifest.xml中聲明組件時,用android:process屬性來指定。
不知定process屬性,則默認運行在主進程中,主進程名字為包名。
android:process = package:remote,將運行在package:remote進程中,屬於全局進程,其他具有相同shareUID與簽名的APP可以跑在這個進程中。
android:process = :remote ,將運行在默認包名:remote進程中,而且是APP的私有進程,不允許其他APP的組件來訪問
第二:多進程引發的問題
靜態成員和單例失效:每個進程保持各自的靜態成員和單例,相互獨立。
線程同步機制失效:每個進程有自己的線程鎖。
SharedPreferences可靠性下降:不支持並發寫,會出現臟數據。
Application多次創建:不同進程跑在不同虛擬機,每個虛擬機啟動會創建自己的Application,自定義Application時生命周期會混亂。
綜上,不同進程擁有各自獨立的虛擬機,Application,內存空間,由此引發一系列問題。
第三: 進程間通信
Bundle/Intent傳遞數據:
可傳遞基本類型,String,實現了Serializable或Parcellable介面的數據結構。Serializable是Java的序列化方法,Parcellable是Android的序列化方法,前者代碼量少(僅一句),但I/O開銷較大,一般用於輸出到磁碟或網卡;後者實現代碼多,效率高,一般用戶內存間序列化和反序列化傳輸。
文件共享:
對同一個文件先後寫讀,從而實現傳輸,Linux機制下,可以對文件並發寫,所以要注意同步。順便一提,Windows下不支持並發讀或寫。
Messenger:
Messenger是基於AIDL實現的,服務端(被動方)提供一個Service來處理客戶端(主動方)連接,維護一個Handler來創建Messenger,在onBind時返回Messenger的binder。
雙方用Messenger來發送數據,用Handler來處理數據。Messenger處理數據依靠Handler,所以是串列的,也就是說,Handler接到多個message時,就要排隊依次處理。
AIDL:
AIDL通過定義服務端暴露的介面,以提供給客戶端來調用,AIDL使伺服器可以並行處理,而Messenger封裝了AIDL之後只能串列運行,所以Messenger一般用作消息傳遞。
通過編寫aidl文件來設計想要暴露的介面,編譯後會自動生成響應的java文件,伺服器將介面的具體實現寫在Stub中,用iBinder對象傳遞給客戶端,客戶端bindService的時候,用asInterface的形式將iBinder還原成介面,再調用其中的方法。
ContentProvider:
系統四大組件之一,底層也是Binder實現,主要用來為其他APP提供數據,可以說天生就是為進程通信而生的。自己實現一個ContentProvider需要實現6個方法,其中onCreate是主線程中回調的,其他方法是運行在Binder之中的。自定義的ContentProvider注冊時要提供authorities屬性,應用需要訪問的時候將屬性包裝成Uri.parse("content://authorities")。還可以設置permission,readPermission,writePermission來設置許可權。 ContentProvider有query,delete,insert等方法,看起來貌似是一個資料庫管理類,但其實可以用文件,內存數據等等一切來充當數據源,query返回的是一個Cursor,可以自定義繼承AbstractCursor的類來實現。
Socket:
學過計算機網路的對Socket不陌生,所以不需要詳細講述。只需要注意,Android不允許在主線程中請求網路,而且請求網路必須要注意聲明相應的permission。然後,在伺服器中定義ServerSocket來監聽埠,客戶端使用Socket來請求埠,連通後就可以進行通信。

F. 安卓傳值中使用Serializable和Parcelable的區別

在安卓開發中,我們經常會遇到這樣一個問題,就是要在兩個Activity之間傳遞一個實體對象,那麼我們就會用到
Serializable或者Parcelable,這兩個方法是用來序列化數據的,主要是用在不同的Activity之間在通過intent進行通信的
時候,數據傳輸時,Data部分的傳輸。

我們一般的在兩個Activity之間傳遞參數是這樣的,如下:

Intent it=new Intent();
Bundle bd=new Bundle();
bd.putInt("aa",20);
bd.putString("bb",ok);
it.setExtras(bd);
it.setClass(Activity1.this.class,Activity2.this.class) startActivity(it,Activity2.this.class);

就這樣傳遞,然後在第二個Activity中接收,如下:

Bundle bd1=(Bundle)getIntent().getExtras();
String str=bd1.getString("bb");
int ii=bd1.getInt("aa");

這樣,就得到了傳遞的數據,如果只是傳遞一些普通的數據,這個方法就可以了,但是如果傳輸的是一個自定義的結構(例如 自定義的類),或是嵌套(結構) 數據,就要進行序列化了,否則就會亂碼無法解析了。比如說,自定義一個類:

public Book {
private string bookname;
private string author;
Book(string s1,string s2){bookname=s1;author=s2}
public Setbookname(string s){bookname=s;}
public Setauthor(string s){author=s;}
public string getbookname(){return bookname ; }
public string getauthor(){return author;}
}

如果要傳遞這個類,那麼就要用到Serializable或者Parcelable了。

序列化原因:
1.永久性保存對象,保存對象的位元組序列到本地文件中;
2.通過序列化對象在網路中傳遞對象;
3.通過序列化在進程間傳遞對象。

但是Serializable與Parcelable兩個都是序列化,什麼時候用哪個呢?
1.在使用內存的時候,Parcelable 類比Serializable性能高,所以推薦使用Parcelable類。
2.Serializable在序列化的時候會產生大量的臨時變數,從而引起頻繁的GC。
3.Parcelable不能使用在要將數據存儲在磁碟上的情況,因為Parcelable不能很好的保證數據的持續性在外界有變化的情況下。盡管Serializable效率低點, 也不提倡用,但在這種情況下,還是建議你用Serializable 。

實現的時候

1.Serializable 的實現,只需要繼承 implements Serializable 即可。這只是給對象打了一個標記,系統會自動將其序列化。

比如說,像下面這樣:

public class Person implements Serializable {
private static final long serialVersionUID = -7060210544600464481L;
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

}

2.Parcelabel 的實現,需要在類中添加一個靜態成員變數 CREATOR,這個變數需要繼承 Parcelable.Creator 介面。

public class Book implements Parcelable {
private String bookName;
private String author;
private int publishTime;

public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getPublishTime() {
return publishTime;
}
public void setPublishTime(int publishTime) {
this.publishTime = publishTime;
}

public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() {
public Book createFromParcel(Parcel source) {
Book myBook = new Book();
myBook.bookName = source.readString();
myBook.author = source.readString();
myBook.publishTime = source.readInt();
return myBook;
}
public Book[] newArray(int size) {
return new Book[size];
}
};

public int describeContents() {
return 0;
}
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeString(bookName);
parcel.writeString(author);
parcel.writeInt(publishTime);
}
}

G. android關於Parcelable的createFromParcel及writeToParcel傳遞數組的問題

你有沒有在 DetailList 裡面添加 Parcelable.Creator ?實現 createFromParcel(Parcel in)
以及 new Array(int size) 方法?

H. android 工程異常 Log: Parcel Reading a NULL string not supported here.

Log提示,某個字元串為null了,建議到logcat中查看詳細的異常日誌。

Android開發中,所的有輸出都在logcat中 包含System.out輸出和printStackTrace()輸出都在Logcat中,Android開發,建議使用android提供的Log工具類來列印信息。

找到Logcat視圖的方式:

  1. Eclipse 點擊 Window

  2. Show View會出來一個對話框

  3. 點擊Ok按鈕時,會在控制台窗口出現LogCat視圖


android.util.Log常用的方法有以下5個:Log.v()Log.d()Log.i()Log.w()以及Log.e()。根據首字母對應VERBOSE,DEBUG,INFO,WARN,ERROR。

1、Log.v 的調試顏色為黑色的,任何消息都會輸出,這里的v代表verbose啰嗦的意思,平時使用就是Log.v("","");

2、Log.d的輸出顏色是藍色的,僅輸出debug調試的意思,但他會輸出上層的信息,過濾起來可以通過DDMS的Logcat標簽來選擇.

3、Log.i的輸出為綠色,一般提示性的消息information,它不會輸出Log.v和Log.d的信息,但會顯示i、w和e的信息

4、Log.w的意思為橙色,可以看作為warning警告,一般需要我們注意優化Android代碼,同時選擇它後還會輸出Log.e的信息。

5、Log.e為紅色,可以想到error錯誤,這里僅顯示紅色的錯誤信息,這些錯誤就需要認真的分析,查看棧的信息了。

I. android parcelable有沒有限制大小

androidintent傳遞數據是沒有數量限制的,但是Parcelable是將數據存到內存中的ROM中,數量是沒有限制的,但是一個android應用進程最大使用16MB的內存。Intent是一種運行時綁定(run-timebinding)機制,它能在程序運行過程中連接兩個不同的組件。通過Intent,你的程序可以向Android表達某種請求或者意願,Android會根據意願的內容選擇適當的組件來完成請求。比如,有一個Activity希望打開網頁瀏覽器查看某一網頁的內容,那麼這個Activity只需要發出WEB_SEARCH_ACTION給Android,Android就會根據Intent的請求內容,查詢各組件注冊時聲明的IntentFilter,找到網頁瀏覽器的Activity來瀏覽網頁。在Android中實現Parcelable介面的類可以支持序列與反序列化,以下是一個實現的舉例:1.實現Parcelable介面2.添加實體屬性3.覆寫writeToParcel(Parceldest,intflags)方法,指定寫入Parcel類的數據。4.創建Parcelable.Creator靜態對象,有兩個方法createFromParcel(Parcelin)與newArray(intsize),前者指定如何從Parcel中讀取出數據對象,後者創建一個數組。5.覆寫describeContents方法,默認返回0。

J. Android Parcelable和Serializable的區別

Parcelable和Serializable的作用、效率、區別及選擇:

1、作用Serializable的作用是為了保存對象的屬性到本地文件、資料庫、網路流、rmi以方便數據傳輸,當然這種傳輸可以是程序內的也可以是兩個程序間的。而Android的Parcelable的設計初衷是因為Serializable效率過慢,為了在程序內不同組件間以及不同Android程序間(AIDL)高效的傳輸數據而設計,這些數據僅在內存中存在,Parcelable是通過IBinder通信的消息的載體。從上面的設計上我們就可以看出優劣了。

2、效率及選擇Parcelable的性能比Serializable好,在內存開銷方面較小,所以在內存間數據傳輸時推薦使用Parcelable,如activity間傳輸數據,而Serializable可將數據持久化方便保存,所以在需要保存或網路傳輸數據時選擇Serializable,因為android不同版本Parcelable可能不同,所以不推薦使用Parcelable進行數據持久化。

3、編程實現對於Serializable,類只需要實現Serializable介面,並提供一個序列化版本id(serialVersionUID)即可。而Parcelable則需要實現writeToParcel、describeContents函數以及靜態的CREATOR變數,實際上就是將如何打包和解包的工作自己來定義,而序列化的這些操作完全由底層實現。

Parcelable的一個實現例子如下

[java] view plain

public class MyParcelable implements Parcelable {

private int mData;

private String mStr;

public int describeContents() {

return 0;

}

// 寫數據進行保存

public void writeToParcel(Parcel out, int flags) {

out.writeInt(mData);

out.writeString(mStr);

}

// 用來創建自定義的Parcelable的對象

public static final Parcelable.Creator CREATOR

= new Parcelable.Creator() {

public MyParcelable createFromParcel(Parcel in) {

return new MyParcelable(in);

}

public MyParcelable[] newArray(int size) {

return new MyParcelable[size];

}

};

// 讀數據進行恢復

private MyParcelable(Parcel in) {

mData = in.readInt();

mStr = in.readString();

}

}

從上面我們可以看出Parcel的寫入和讀出順序是一致的。如果元素是list讀出時需要先new一個ArrayList傳入,否則會報空指針異常。如下:

list = new ArrayList();

in.readStringList(list);

PS:
在自己使用時,read數據時誤將前面int數據當作long讀出,結果後面的順序錯亂,報如下異常,當類欄位較多時務必保持寫入和讀取的類型及順序一致。

11-21 20:14:10.317: E/AndroidRuntime(21114): Caused by:
java.lang.RuntimeException: Parcel android.os.Parcel@4126ed60: Unmarshalling
unknown type code 3014773 at offset 164

4、高級功能上Serializable序列化不保存靜態變數,可以使用Transient關鍵字對部分欄位不進行序列化,也可以覆蓋writeObject、readObject方法以實現序列化過程自定義。

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:336
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:378
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:612
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:32
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:945
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:742
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:803
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:511
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:372