【问题标题】:Android issue in Parcelable while passing to next activity传递到下一个活动时 Parcelable 中的 Android 问题
【发布时间】:2012-07-05 14:06:42
【问题描述】:

我正在尝试将我自己的 Message Class 从活动传递到另一个活动 为此,我正在使用 parcelable。 在尝试通过捆绑包时

Activity1 - 传递捆绑包

Intent i = new Intent(getApplicationContext(), Activity2.class);
Bundle b=new Bundle();
b.putParcelable("FolderList", mainMP3List)); //***mainMP3List is MusicFolder object***
i.putExtras(b);
startActivityForResult(i, 100); 

Activity2 - 获取捆绑包

if(b.containsKey("FolderList"))
mainMP3List = b.getParcelable("FolderList");//Error is the here (readBundle: bad magic number)

我无法从第二个活动中访问它们 我收到了这样的错误

Bundle : readBundle: 坏幻数

import java.util.ArrayList;

import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;

public class MusicFolder implements Parcelable{

private ArrayList<SongsNameList> songsList=new ArrayList<SongsNameList>();  
private ArrayList<MusicFolder> listOfFolders=new ArrayList<MusicFolder>();


public ArrayList<SongsNameList> getSongsList() {
    return songsList;
}

public void addSongInList(SongsNameList song) {
    this.songsList.add(song);
}

public ArrayList<MusicFolder> getListOfFolders() {
    return listOfFolders;
}
public void addFolderInList(MusicFolder folder) {
    this.listOfFolders.add(folder);
}


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

@Override
public void writeToParcel(Parcel dest, int flags) {
    //dest.writeString(category);
    Bundle b = new Bundle();
    b.putParcelableArrayList("songs", songsList);
    b.putParcelableArrayList("folders", listOfFolders);
    dest.writeBundle(b);

}

public static final Parcelable.Creator<MusicFolder> CREATOR = 
        new Parcelable.Creator<MusicFolder>() { 
    public MusicFolder createFromParcel(Parcel in) { 
        MusicFolder category = new MusicFolder();
        //category.listOfFolders = in.readString();
        Bundle b1 = in.readBundle(SongsNameList.class.getClassLoader());        
        category.songsList = b1.getParcelableArrayList("songs");

        Bundle b2 = in.readBundle(MusicFolder.class.getClassLoader());        
        category.listOfFolders = b2.getParcelableArrayList("folders");

        return category;
    }

    @Override
    public MusicFolder[] newArray(int size) {
        return new MusicFolder[size];
    }
};



  }

【问题讨论】:

  • 那么SongsNameList 也可以打包吗?
  • 只有当我单独检查它的工作正常时,它也可以打包
  • 你能从 logcat 发布readBundle: trace = ... 吗?应该就在bad magic number之后

标签: android serialization parcelable


【解决方案1】:

尚未测试,但我认为不是:

    Bundle b1 = in.readBundle(SongsNameList.class.getClassLoader());        
    category.songsList = b1.getParcelableArrayList("songs");

    Bundle b2 = in.readBundle(MusicFolder.class.getClassLoader());        
    category.listOfFolders = b2.getParcelableArrayList("folders");

应该是这样的:

    Bundle b = in.readBundle(SongsNameList.class.getClassLoader());        
    category.songsList = b.getParcelableArrayList("songs");
    category.listOfFolders = b.getParcelableArrayList("folders");

【讨论】:

  • 是的,应该是这样的。
【解决方案2】:

这可能是由于您以特定顺序将值/类型写入 Parcelable 并以不同顺序读取它(违反了您的数据边界之一)。

查看您的保存/加载顺序,如果您没有发现问题,请发布适用于您的 Parcelable 实现的代码,供我们查看。

【讨论】:

  • 他已经添加了可打包的代码。无论哪种方式,问题都是他编写了一个 Bundle(带有两个 arraylist)但读取了两个 bundle。
  • ...不,他没有添加 Parcelable 代码...如果他的问题是 setExtras() 正在覆盖捆绑包,则代码不会在 getParcelable() 中触发,因为他有直接检查之前的密钥。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多