可分配对象导致错误

时间:2014-04-15 10:32:19

标签: java android android-intent parcelable

我创建了一个类似于下面的类,它实现了Parcelable

package com.fyrweel.cityinfo;

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

public class JSONParser implements Parcelable  {

    public String fcodeName;
    public String toponymName;
    public String countrycode;
    public String fcl;
    public String fclName;
    public String name;
    public String wikipedia;
    public Double lng;
    public Double lat;
    public String fcode;
    public Long geonameId;
    public Long population;

     public int describeContents() {
            return 0;
        }

        // write your object's data to the passed-in Parcel
        public void writeToParcel(Parcel out, int flags) {
            out.writeString(fcodeName);
            out.writeString(toponymName);
            out.writeString(countrycode);
            out.writeString(fcl);
            out.writeString(fclName);
            out.writeString(name);
            out.writeString(wikipedia);
            out.writeString(fcode);
            out.writeLong(geonameId);
            out.writeLong(population);
            out.writeDouble(lng);
            out.writeDouble(lat);
        }

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

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

        JSONParser(Parcel in) {
            fcodeName = in.readString();
            toponymName = in.readString();
            countrycode = in.readString();
            fcl = in.readString();
            fclName = in.readString();
            name = in.readString();
            wikipedia = in.readString();
            fcode = in.readString();
            geonameId = in.readLong();
            population = in.readLong();
            lng = in.readDouble();
            lat = in.readDouble();
        }

}

然后我尝试使用意图将此类的对象从一个活动传递到另一个活动。在第一个活动中,我使用了以下代码:

Intent detailsActivityLauncher = new Intent(MainActivity.this, DetailsActivity.class);
detailsActivityLauncher.putExtra("SelectedCityDetails", (Parcelable)aCity);
startActivityForResult(detailsActivityLauncher, 0);

在第二个活动中,以下代码接收它:

Intent recievedIntent = getIntent();        
JSONParser theCity = (JSONParser)recievedIntent.getParcelableExtra("SelectedCityDetails");

当第二个活动加载时,在LogCat中收到以下错误:

04-15 15:50:03.680: E/AndroidRuntime(2958): FATAL EXCEPTION: main
04-15 15:50:03.680: E/AndroidRuntime(2958): Process: com.fyrweel.cityinfo, PID: 2958
04-15 15:50:03.680: E/AndroidRuntime(2958): java.lang.NullPointerException
04-15 15:50:03.680: E/AndroidRuntime(2958):     at com.fyrweel.cityinfo.JSONParser.<init>(JSONParser.java:55)
04-15 15:50:03.680: E/AndroidRuntime(2958):     at com.fyrweel.cityinfo.MainActivity$1.onSuccess(MainActivity.java:66)
04-15 15:50:03.680: E/AndroidRuntime(2958):     at com.loopj.android.http.AsyncHttpResponseHandler.onSuccess(AsyncHttpResponseHandler.java:232)
04-15 15:50:03.680: E/AndroidRuntime(2958):     at com.loopj.android.http.AsyncHttpResponseHandler.onSuccess(AsyncHttpResponseHandler.java:220)
04-15 15:50:03.680: E/AndroidRuntime(2958):     at com.loopj.android.http.AsyncHttpResponseHandler.onSuccess(AsyncHttpResponseHandler.java:245)
04-15 15:50:03.680: E/AndroidRuntime(2958):     at com.loopj.android.http.AsyncHttpResponseHandler.handleMessage(AsyncHttpResponseHandler.java:365)
04-15 15:50:03.680: E/AndroidRuntime(2958):     at com.loopj.android.http.AsyncHttpResponseHandler$ResponderHandler.handleMessage(AsyncHttpResponseHandler.java:135)
04-15 15:50:03.680: E/AndroidRuntime(2958):     at android.os.Handler.dispatchMessage(Handler.java:102)
04-15 15:50:03.680: E/AndroidRuntime(2958):     at android.os.Looper.loop(Looper.java:136)
04-15 15:50:03.680: E/AndroidRuntime(2958):     at android.app.ActivityThread.main(ActivityThread.java:5017)
04-15 15:50:03.680: E/AndroidRuntime(2958):     at java.lang.reflect.Method.invokeNative(Native Method)
04-15 15:50:03.680: E/AndroidRuntime(2958):     at java.lang.reflect.Method.invoke(Method.java:515)
04-15 15:50:03.680: E/AndroidRuntime(2958):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-15 15:50:03.680: E/AndroidRuntime(2958):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-15 15:50:03.680: E/AndroidRuntime(2958):     at dalvik.system.NativeStart.main(Native Method)

JSONParser.java的第55行是:

fcodeName = in.readString();

为什么会这样?如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

试试这个:

JSONParser theCity = (JSONParser) getIntent().getExtras().getParcelable("SelectedCityDetails");

另外

detailsActivityLauncher.putExtra("SelectedCityDetails", aCity);

希望这有帮助!