我想知道确切的,
parcelable还是serialization技术将数据从一个活动发送到另一个活动?提前致谢.
public class GetSetClass implements Serializable {
private int dt = 10;
/** pass any object, drwabale */
public int getDt() {
return dt;
}
public void setDt(int dt) {
this.dt = dt;
}
}
Run Code Online (Sandbox Code Playgroud) 所以我昨天一直在谷歌上搜索大部分时间,并且似乎无法绕过如何将一个arraylist传递给一个sublativity.有大量的示例和片段传递原始数据类型,但我所拥有的是类型为address的arraylist (下面是address.java).
我已经在stackoverflow和网络上发现了很多东西,但除了一个带有GeoPoint示例的东西之外没什么值得关注的.再次,它看起来像他们只是将GeoPoint对象扁平化为两个整数并将其传入.我不能这样做,因为我的地址类可能会扩展为包括整数,浮点数等等.现在,为简单起见,下面的测试应用程序只有两个字符串.我想如果我可以让parcelalbe的东西与之合作,其余的就可以了.
有人可以为非基本对象的ArrayList发布一个工作示例,或者可能在下面添加代码以使其工作吗?
更新:以下代码现在在回复/编辑后工作.谢谢!
/* helloParcel.java */
public class helloParcel extends Activity
{
// holds objects of type 'address' == name and state
private ArrayList <address> myList;
@Override
public void onCreate (Bundle savedInstanceState)
{
super.onCreate (savedInstanceState);
setContentView (R.layout.main);
Button b1 = (Button) findViewById(R.id.button1);
b1.setOnClickListener(ocl);
myList = new ArrayList();
address frank = new address ("frank", "florida");
address mary = new address ("mary", "maryland");
address monty = new address ("monty", "montana");
myList.add (frank);
myList.add (mary);
myList.add …Run Code Online (Sandbox Code Playgroud) 我搜索了一些主题,但没有找到解决我问题的方法.
public class Series implements Parcelable {
private String name;
private int numOfSeason;
private int numOfEpisode;
/** Constructors and Getters/Setters have been removed to make reading easier **/
public Series(Parcel in) {
String[] data = new String[3];
in.readStringArray(data);
this.name = data[0];
this.numOfSeason = Integer.parseInt(data[1]);
this.numOfEpisode = Integer.parseInt(data[2]);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] { this.name,
String.valueOf(this.numOfSeason),
String.valueOf(this.numOfEpisode) });
}
private void readFromParcel(Parcel in) {
name = in.readString(); …Run Code Online (Sandbox Code Playgroud) 所以我知道建议在Android中使用Parcelable而不是Serializable,因为它更快.
我的问题是:使用Serializable是不可避免的吗?
如果我有一个我想要序列化的自定义对象,那么假设我有以下类定义
public class Person {
String name;
int Age;
...
....
}
Run Code Online (Sandbox Code Playgroud)
使这个parcelable很容易,因为Person类包含parcel.write*()支持的类型,即parcel.writeString和parcel.writeInt
现在,如果Person类如下:
public class PersonTwo {
MyCustomObj customObj;
String name;
int Age;
...
....
}
Run Code Online (Sandbox Code Playgroud)
我怎么想包裹MyCustomObj对象?看来我需要再次使用serializable吗?但同样,我认为使用serializable是慢的,似乎我们别无选择,只能在这种情况下使用它.
我不明白
谁能告诉我在这种情况下我会如何包裹PersonTwo?
在parcel的情况下,我找不到任何有关如何处理整数数组的解决方案(我想使用这两个函数dest.writeIntArray(storeId); 和 in.readIntArray(storeId);).
这是我的代码
public class ResponseWholeAppData implements Parcelable {
private int storeId[];
public int[] getStoreId() {
return storeId;
}
public void setStoreId(int[] storeId) {
this.storeId = storeId;
}
@Override
public int describeContents() {
return 0;
}
public ResponseWholeAppData(){
storeId = new int[2];
storeId[0] = 5;
storeId[1] = 10;
}
public ResponseWholeAppData(Parcel in) {
if(in.readByte() == (byte)1)
in.readIntArray(storeId); //how to do this storeId=in.readIntArray(); ?
}
}
@Override
public void writeToParcel(Parcel dest, int flags) {
if(storeId!=null&&storeId.length>0)
{
dest.writeByte((byte)1);
dest.writeIntArray(storeId); …Run Code Online (Sandbox Code Playgroud) 你如何对Parcelable进行单元测试?我创建了一个Parcelable类,并编写了这个单元测试
TestClass test = new TestClass();
Bundle bundle = new Bundle();
bundle.putParcelable("test", test);
TestClass testAfter = bundle.getParcelable("test");
assertEquals(testAfter.getStuff(), event1.getStuff());
Run Code Online (Sandbox Code Playgroud)
我故意试图通过返回null来测试失败createFromParcel(),但它似乎成功了.它似乎在需要之前不会被包围.我该怎么强迫Bundle来...捆绑?
我在我的onClick()方法中的代码中有以下内容
List<Question> mQuestionsList = QuestionBank.getQuestions();
Run Code Online (Sandbox Code Playgroud)
现在我有了这一行后的意图,如下:
Intent resultIntent = new Intent(this, ResultActivity.class);
resultIntent.putParcelableArrayListExtra("QuestionsExtra", (ArrayList<? extends Parcelable>) mQuestionsList);
startActivity(resultIntent);
Run Code Online (Sandbox Code Playgroud)
我不知道如何将这个问题列表从一个活动传递到另一个活动My Question类
public class Question {
private int[] operands;
private int[] choices;
private int userAnswerIndex;
public Question(int[] operands, int[] choices) {
this.operands = operands;
this.choices = choices;
this.userAnswerIndex = -1;
}
public int[] getChoices() {
return choices;
}
public void setChoices(int[] choices) {
this.choices = choices;
}
public int[] getOperands() {
return operands;
}
public void setOperands(int[] operands) {
this.operands …Run Code Online (Sandbox Code Playgroud) 由于Unmarshalling异常,我正在恢复应用程序崩溃.我检查了所有Serializables都没有参数的构造函数,甚至使用ObjectStream检查了所有可序列化(保存到文件并从文件加载).我如何理解导致异常的parcelable偏移的实际类类型:
Parcel android.os.Parcel@42209460: Unmarshalling unknown type code
2131165303 at offset 3748
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2080)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2105)
at android.app.ActivityThread.access$600(ActivityThread.java:136)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4876)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:804)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:571)
at com.kdgdev.xtension.core.XtensionMain.main(XtensionMain.java:91)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@42209460: Unmarshalling unknown type code 2131165303
at offset 3748
at android.os.Parcel.readValue(Parcel.java:2032)
at android.os.Parcel.readSparseArrayInternal(Parcel.java:2255)
at android.os.Parcel.readSparseArray(Parcel.java:1687)
at android.os.Parcel.readValue(Parcel.java:2022)
at android.os.Parcel.readMapInternal(Parcel.java:2226)
at android.os.Bundle.unparcel(Bundle.java:223)
at android.os.Bundle.getSparseParcelableArray(Bundle.java:1232)
at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1690)
at android.app.Activity.onRestoreInstanceState(Activity.java:999)
at com.actionbarsherlock.app.SherlockFragmentActivity.onRestoreInstanceState(Unknown
Source)
at name.myname.android.app.ui.MainActivity.onRestoreInstanceState(Unknown
Source)
at android.app.Activity.performRestoreInstanceState(Activity.java:971)
at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1130) …Run Code Online (Sandbox Code Playgroud) 在Parcel的文档中,它声明了一种方法
public final void writeBooleanArray (boolean[] val)
Run Code Online (Sandbox Code Playgroud)
但是没有办法 writeBoolean(boolean val)
还存在:
public final void writeLong (long val)
public final void writeLongArray (long[] val)
Run Code Online (Sandbox Code Playgroud)
因此,类似的模式可用于其他原始类型.
有人可以解释为什么会这样吗?
我正在尝试包含一个包含一些字符串/ int变量和一个对象变量的对象.字符串和int正在工作,但不是嵌套对象.我明白我也必须这样做,但我显然做错了=.在我的嵌套类中,该writeToParcel方法被调用(我通过Log.d()调用检查),但是createFromParcel()没有.我最终得到一个null对象.这是我的简化代码:
public class MyClass implements Parcelable {
public MyClass() {
}
private Integer id;
private String name;
private MyOtherClass otherClass = new MyOtherClass();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public OtherClass getOtherClass() {
return otherClass;
}
public void setOtherClass(OtherClass otherClass) {
this.otherClass = otherClass;
} …Run Code Online (Sandbox Code Playgroud) android ×10
parcelable ×10
arraylist ×1
bundle ×1
ipc ×1
java ×1
marshalling ×1
parcel ×1
serializable ×1
unit-testing ×1