2011-07-28 57 views
7

值正在傳遞並執行正確,但我看到這些被扔在logcat中,我想消除這些,我檢查了舊的論壇,但沒有具體。我是下面張貼我的代碼,請不要讓我知道爲什麼會變成這樣的問題發生,這被拋出反覆是android.os.BadParcelableException:解組時發生ClassNotFoundException:異常

public class ExecutionInfo implements Parcelable 
{ 

    private int offSet; 

    private List<Integer> pollingIntervalArray = new ArrayList<Integer>(); 

    private List<String> commandLst= new ArrayList<String>(); 

    private int repeatCount; 

    private int executorId; 

    private int processType; 


    public ExecutionInfo() 
    { 

    } 

    public ExecutionInfo(Parcel source) 
    { 
     offSet = source.readInt(); 
     repeatCount = source.readInt(); 
     executorId = source.readInt(); 
     processType = source.readInt(); 
     source.readStringList(commandLst); 
     source.readList(pollingIntervalArray, Integer.class.getClassLoader()); 
    } 

    public int getOffSet() 
    { 
     return offSet; 
    } 

    public void setOffSet(int offSet) 
    { 
     this.offSet = offSet; 
    } 

    public List<Integer> getInterval() 
    { 
     return pollingIntervalArray; 
    } 

    public void setInterval(List<Integer> pollingIntervalVec) 
    { 
     this.pollingIntervalArray = pollingIntervalVec; 
    } 

    public List<String> getCommandLst() 
    { 
     return commandLst; 
    } 

    public void setCommands(String command) 
    { 
     commandLst.add(command); 
    } 

    public int getRepeatCount() 
    { 
     return repeatCount; 
    } 

    public void setRepeatCount(int repeatCount) 
    { 
     this.repeatCount = repeatCount; 
    } 

    public int getExecutorId() 
    { 
     return executorId; 
    } 

    public void setExecutorId(int executorId) 
    { 
     this.executorId = executorId; 
    } 

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

    @Override 
    public void writeToParcel(Parcel dest, int flags) 
    { 

      dest.writeInt(offSet); 
      dest.writeInt(repeatCount); 
      dest.writeInt(executorId); 
      dest.writeInt(processType); 
      dest.writeStringList(commandLst); 
      dest.writeList(pollingIntervalArray); 
    } 

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

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

    public int getProcessType() 
    { 
     return processType; 
    } 

    public void setProcessType(int processType) 
    { 
     this.processType = processType; 
    } 
} 

例外:但這並不妨礙執行

: com.seven.superapptwitter.xmlHandler.ExecutionInfo 
07-27 16:52:11.418: WARN/Intent(2458): Failure filling in extras 
07-27 16:52:11.418: WARN/Intent(2458): android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.seven.superapptwitter.xmlHandler.ExecutionInfo 
07-27 16:52:11.418: WARN/Intent(2458):  at android.os.Parcel.readParcelable(Parcel.java:1883) 
07-27 16:52:11.418: WARN/Intent(2458):  at android.os.Parcel.readValue(Parcel.java:1771) 
07-27 16:52:11.418: WARN/Intent(2458):  at android.os.Parcel.readMapInternal(Parcel.java:2008) 
07-27 16:52:11.418: WARN/Intent(2458):  at android.os.Bundle.unparcel(Bundle.java:208) 
07-27 16:52:11.418: WARN/Intent(2458):  at android.os.Bundle.putAll(Bundle.java:281) 
07-27 16:52:11.418: WARN/Intent(2458):  at android.content.Intent.fillIn(Intent.java:5127) 
07-27 16:52:11.418: WARN/Intent(2458):  at com.android.server.am.PendingIntentRecord.sendInner(PendingIntentRecord.java:195) 
07-27 16:52:11.418: WARN/Intent(2458):  at com.android.server.am.PendingIntentRecord.send(PendingIntentRecord.java:177) 
07-27 16:52:11.418: WARN/Intent(2458):  at android.app.PendingIntent.send(PendingIntent.java:400) 
07-27 16:52:11.418: WARN/Intent(2458):  at com.android.server.AlarmManagerService$AlarmThread.run(AlarmManagerService.java:680) 
+0

你設法找到不使用序列化的解決方案? – bencallis

+0

[使用具有ClassLoader作爲參數的Parcel.read方法時,解組爲時出現[「BadParcelableException:ClassNotFoundException異常]的可能重複](http://stackoverflow.com/questions/18126249/badparcelableexception-classnotfoundexception-when-unmarshalling-myclass-wh ) – Flow

回答

-7

好吧,最後我使用serialization,以便我不會得到這個例外。我序列化對象轉換爲字節數組存儲它,然後通過PendingIntent檢查傳遞它。

我相信這增加了頭,但似乎並沒有影響工作。在這種情況下,當警報被觸發我看不出有任何異常

+1

不是一個非常有用的解決方案,因爲您可以跳過使用'Parcelable'並使用'Serializable'來代替。 – Melllvar

+1

你不應該依靠工作而是找到一個更好的解決方案。 – Varundroid

4

我認爲這是回答了你在這裏:Problem unmarshalling parcelables

基本上你需要設置類加載器,因爲AlarmManagerService是一個單獨的OS進程。

+0

U的意思是,這一行是拋出錯誤source.readList(pollingIntervalArray,Integer.class.getClassLoader());我沒有看到類加載器已通過或需要通過的其他任何地方? – Kavitha

+0

不可以。您甚至沒有進入ClassNotFoundException的那一行(在您提供的堆棧跟蹤中)。你並不孤單,試圖通過PendingIntent發送一個parcelable:http://stackoverflow.com/questions/2307476/classnotfoundexception-when-using-custom-parcelable/2307764#2307764 – Jason

+0

哎呀...太快回擊。問題是AlarmManager沒有使用你的類加載器來反序列化PendingIntent,因此它無法訪問你的ExecutionInfo類。不幸的是,它看起來好像你可能不得不使用另一種序列化方法。一種可能性是自己創建一個Parcel('Parcel parcel = Parcel.obtain()'),將其序列化('infoObject.writeToParcel(parcel,0)'),獲取字節數組(byte [] rawParcel = parcel。 marshall()')並將該字節數組放入您的包中。另一方面,你必須使用Parcel.unmarshall(),然後使用構造函數 – Jason

相關問題