2011-07-21 11 views
28

İki Etkinliğim var, birincisinde, Object myObject adlı bir ArrayList'ü anlatayım. İkinci etkinlikte, bu Arraylist'i almam gerek. Bir öğretici buldum: http://prasanta-paul.blogspot.com/2010/06/android-parcelable-example.html Sınıfımı uygulamıştım, bunu açıklamayı sevdim.Android, Parcelable sınıfında readTypedList yöntemini nasıl kullanılır?

public class Chapitre

public class video Parcelable {

private String titre; 
private int numero; 
private String url; 
private String description; 
private String imageUrl; 
private Bitmap image; 
private String duree; 

/** 
* 
* @param nom 
* @param numero 
* @param url 
* @param description 
*/ 
public Video(String titre, String url, String description) { 
    super(); 
    this.titre = titre; 
    this.url = url; 
    this.description = description; 
} 

public Video(int numero, String titre, String url, String description) { 
    super(); 
    this.titre = titre; 
    this.url = url; 
    this.description = description; 
    this.numero = numero; 
} 

public Video(String titre,int numero, String url, String description, String imageUrl) { 
    super(); 
    this.titre = titre; 
    this.url = url; 
    this.description = description; 
    this.imageUrl = imageUrl; 
    this.numero = numero; 

    setImage(fetchImage(imageUrl)); 
} 


//Getters and Setters ... 

@Override 
public int describeContents() { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(titre); 
    dest.writeInt(numero); 
    dest.writeString(url); 
    dest.writeString(description); 
    dest.writeString(imageUrl); 
    dest.writeString(duree); 


} 

public Video(Parcel source){ 
    /* 
    * Reconstruct from the Parcel 
    */ 
    Log.v("TAG", "ParcelData(Parcel source): time to put back parcel data"); 
    titre = source.readString(); 
    numero = source.readInt(); 
    url = source.readString(); 
    description = source.readString(); 
    imageUrl = source.readString(); 
    duree = source.readString(); 
} 

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

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

}

uygulayan Ama çizgi "kaynağında nullPointException olsun Parcelable {

private int numero; 
private String titre; 
private String description; 
private int nbVideo; 
private ArrayList<Video> listeVideo; 

public Chapitre(int numero, String titre, String description, 
     ArrayList<Video> listeVideo) { 
    this.numero = numero; 
    this.titre = titre; 
    this.description = description; 
    this.listeVideo = listeVideo; 
    this.nbVideo = listeVideo.size(); 
} 

//Getters and Setters ... 

private Chapitre(Parcel source) { 
    numero = source.readInt(); 
    titre = source.readString(); 
    description = source.readString(); 
    nbVideo = source.readInt(); 
    source.readTypedList(listeVideo, Video.CREATOR); 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeInt(numero); 
    dest.writeString(titre); 
    dest.writeString(description); 
    dest.writeInt(nbVideo); 
    dest.writeTypedList(listeVideo); 
} 

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

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

} uygular. readTypedList (listeVideo, Video.CREATOR); " Chapitre sınıfında. kimse bana yardımcı olabilir, çok iyi olurdu bu yüzden zaten bu konuda 1 gün israf ettik

07-21 10:07:28.212: ERROR/AndroidRuntime(682): FATAL EXCEPTION: main 
07-21 10:07:28.212: ERROR/AndroidRuntime(682): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.genicorp.video.proto/com.genicorp.video.proto.Lecture}:  java.lang.NullPointerException 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1736) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1752) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:993) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.os.Looper.loop(Looper.java:126) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.app.ActivityThread.main(ActivityThread.java:3997) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at java.lang.reflect.Method.invoke(Method.java:491) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at dalvik.system.NativeStart.main(Native Method) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682): Caused by: java.lang.NullPointerException 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.os.Parcel.readTypedList(Parcel.java:1630) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at com.genicorp.video.proto.Chapitre.<init>(Chapitre.java:70) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at com.genicorp.video.proto.Chapitre.<init>(Chapitre.java:65) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at com.genicorp.video.proto.Chapitre$1.createFromParcel(Chapitre.java:89) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at com.genicorp.video.proto.Chapitre$1.createFromParcel(Chapitre.java:1) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.os.Parcel.readParcelable(Parcel.java:1981) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.os.Parcel.readValue(Parcel.java:1846) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.os.Parcel.readListInternal(Parcel.java:2092) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.os.Parcel.readArrayList(Parcel.java:1536) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.os.Parcel.readValue(Parcel.java:1867) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.os.Parcel.readMapInternal(Parcel.java:2083) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.os.Bundle.unparcel(Bundle.java:215) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.os.Bundle.getParcelableArrayList(Bundle.java:1151) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.content.Intent.getParcelableArrayListExtra(Intent.java:3634) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at com.genicorp.video.proto.Lecture.onCreate(Lecture.java:37) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1700) 
07-21 10:07:28.212: ERROR/AndroidRuntime(682):  ... 11 more 

önceden İnşallah

+4

Önemli olup olmadığından emin değilsiniz, ancak bazı şirketler çok fazla bilgi görmekten kaçarlar. Bu temizlenmemiş çıktıdan, insanlar kimler için çalıştığınızı ve diğer sorularınızı temel alarak yaptığınız uygulamayı anlayabilir. Çıktınızı iyileştirmek de hatalarınızı bulmanıza yardımcı olurdu. – Kheldar

cevap

71

yılında

sayesinde, artık bu çözdüm . Ama bunun üzerine tökezleyen herkes için. Aldığınız NullPointerException, ArrayList'in hiçbir zaman başlatılmamasına neden oldu.

private Chapitre(){ 
    listVideo = new ArrayList<Video>(); 
} 

private Chapitre(Parcel source) { 
    // Call the above constructor 
    this(); 

    numero = source.readInt(); 
    titre = source.readString(); 
    description = source.readString(); 
    nbVideo = source.readInt(); 
    source.readTypedList(listeVideo, Video.CREATOR); 
} 
+6

mükemmel yanıt. Efendim, 'Doğrulama' cevabını hak ediyorsunuz! –

+0

Bu, yukarıdaki sorun için mükemmel bir çözümdür. – Seenu69

-1

Ayrıca değişmez bir boş liste ile nesne başlatılırken düşünün bir boş olmayan Liste nesne başvurusu gerektiren yerine readTypedList ait createTypedArrayList kullanın. Burada

private ArrayList<Video> listevideo = Collections.emptyList()

Diğer ayrıntılar: Collections.emptyList() vs. new instance

+0

"readTypedList()", sağladığınız listeyi doldurduğundan, "Collections.emptyList()" noktasından değiştirilemeyen bir öğe sağlayarak "UnsupportedOperationException" ın atılmasına neden olabilir. – spaaarky21

+0

Üzgünüm, açıklığa kavuşmuş olmalıyım - sözleşmeyi göstermek için listeyi kullanmak isteyen herkesin yeni bir tane oluşturması gerektiğini belirtin. –

0

Ayrıca okumak ve aynı sırada parcelable nesne niteliğini yazmak zorunda akılda tutmak! Ayrıca 2 saat çünkü unshashalling sıralamasında aynı sırada değildi.