我正在尝试实现Parcleable,这样我就可以将它作为额外的添加(这是一个要求)。
下面是类SwinImage的精简版本,它只显示相关细节,即派生自Parcleable的部分:
package com.example.kevin.imagemetadata;
import android.os.Parcel;
import android.os.Parcelable;
public class SwinImage implements Parcelable
{
public SwinImage(String imageName, String location, String[] keywords, String imageDate, boolean share, String email, int rating)
{
update(imageName, location, keywords, imageDate, share, email, rating);
}
//A constructor for when we havent assigned any metadata.
public SwinImage(String imageName)
{
}
public void update(String imageName, String location, String[] keywords, String imageDate, boolean share, String email, int rating)
{
}
@Override
public String toString()
{
}
private void storeImageDetails() {
}
@Override
//We don't need it - but we are forced to due to interface.
public int describeContents()
{
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags)
{
out.writeString(imageName);
out.writeString(location);
out.writeStringArray(keywords);
out.writeString(imageDate);
//Can write boolean array but not boolean...
boolean[] temp = {share};
out.writeBooleanArray(temp);
out.writeString(email);
out.writeInt(rating);
}
public static final Parcelable.Creator<SwinImage> CREATOR = new Parcelable.Creator<SwinImage>()
{
@Override
public SwinImage createFromParcel(Parcel parcel)
{
return new SwinImage(parcel);
}
@Override
public SwinImage[] newArray(int i)
{
return new SwinImage[i];
}
};
//THE PRIVATE CONSTRUCTOR - FOR INTERNAL USE ONLY.
private SwinImage(Parcel parcel)
{
imageName = parcel.readString();
location = parcel.readString();
parcel.readStringArray(keywords);
imageDate = parcel.readString();
boolean[] tempArr = new boolean[1];
parcel.readBooleanArray(tempArr);
share = tempArr[0];
email = parcel.readString();
rating = parcel.readInt();
}
}好的..。所以,在呼叫课上,我这样做:
public void ClickedImage(View v)
{
Intent i = new Intent(this, MetaDataActivity.class);
switch (getResources().getResourceEntryName(v.getId()))
{
case "burgerView":
i.putExtra("SENT_IMAGE", burger); //IT IMPLEMENTS PARCLEABLE THEREFORE WE CAN PASS IT WHERE IT LOOKS FOR A PARCEL
break;
case "pitaView":
i.putExtra("SENT_IMAGE", pita);
break;
case "pizzaView":
i.putExtra("SENT_IMAGE", pizza);
break;
case "steakView":
i.putExtra("SENT_IMAGE", steak);
break;
}
startActivityForResult(i, GET_AND_SET_METADATA_REQUEST);
}我在最后设置了一个断点,确实可以看出它的意图是正确的:
表示额外的意图
然而,当涉及到得到它时:
@Override
protected void onCreate(Bundle savedInstanceState)
{
Log.d("Does", "Does this work");
Intent i;
i = getIntent();
image = i.getExtras().getParcelable("SENT_IMAGE");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_meta_data);
}它从来没有存在过。分配给image的任务使程序崩溃,我无法通过调试器看到我的SwinImage甚至存在于意图中。
我做错了什么?它为什么要崩溃?我尝试了几个小时的解决方案(主要是改变我分配的方式--一些“解决方案”阻止了它崩溃,但是image被分配为null)。
有人能提供一些洞察力吗?谢谢。
编辑:
我试着把getIntent移到onCreate之后,但没有结果。
编辑#2:堆栈跟踪:
http://pastebin.com/raw/XJbPxHRv
以及steak的类型等:
public class MainActivity extends AppCompatActivity {
static final int GET_AND_SET_METADATA_REQUEST = 1; // The request code
SwinImage burger, pita, pizza, steak;发布于 2016-09-25 10:45:48
您不能在getIntent()之前调用super.onCreate() --在这一点上没有意图可用。
在super调用之前移动getIntent调用。
更新:
在进行上述修复后,堆栈跟踪将显示以下问题:
NullPointerException: Attempt to get length of null array
at android.os.Parcel.readStringArray(Parcel.java:1026)
at com.example.kevin.imagemetadata.SwinImage.<init>(SwinImage.java:108)keywords似乎是null,所以尝试从包裹崩溃中读取它。要么确保keywords永远不为null,要么放置一个布尔值,说明关键字是否可以读取。此外,根据这一点:如何在包中使用writeStringArray()和readStringArray()您可能应该使用createStringArray而不是readStringArray,这要简单得多。
请注意:您应该始终仔细阅读崩溃堆栈跟踪,以更好地理解为什么您的代码没有按预期工作,通常这是修复破损代码的最佳方法。
发布于 2016-09-25 18:09:39
在以SwinImage为参数的Parcel构造函数中,可以执行以下操作:
parcel.readStringArray(keywords);这是因为它试图将String数组读入keywords,这是null,因为您没有首先初始化它。
调用readStringArray()时,向它传递对现有String数组的引用,该数组将从Parcel复制String数组。
注意,只有当传递给readStringArray()和writeStringArray()的数组引用不是null,并且传递给readStringArray()的数组中的元素数与传递给writeStringArray()的数组中的元素数完全相同时,才能正确工作。
您应该使用没有这些限制的readStringArray(),而不是createStringArray()。像这样使用它:
keywords = parcel.createStringArray();https://stackoverflow.com/questions/39685907
复制相似问题