【问题标题】:How to send Parcelable Object that contains doubly nested Parcelable arrays如何发送包含双重嵌套 Parcelable 数组的 Parcelable 对象
【发布时间】:2016-01-09 03:24:27
【问题描述】:

我正在尝试将我的启动活动中的一个对象写入 Parcel,然后使用意图将其发送到我的主要活动。但是,在我的 Main 活动中检索 ParacelableArrayExtra 时出现空指针异常。所以我检查了 null 来处理 null 条件。但是,预测对象在放入意图之前确实有数据,因此不应满足此条件。

我似乎永远不会将对象数组放入意图中。我这是因为我的数据被错误地打包了?

StartUpActivity.java

public class StartUpActivity extends AppCompatActivity {

    public static final String FORECAST_KEY = "FORECAST_KEY";
    private Forecast[] mForecasts;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new BackgroundTask(this).execute();
    }

    @Override
    public void startActivityForResult(Intent intent, int requestCode) {
        super.startActivityForResult(intent, requestCode);
    }


    private class BackgroundTask extends AsyncTask {
        private Intent mIntent;
        private Context mContext;

        private static final String TAG = "BACKGROUND_TASK";

        public BackgroundTask(Context context) {
            mContext = context;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mIntent = new Intent(StartUpActivity.this, MainActivity.class);
        }

        @Override
        protected Object doInBackground(Object[] params) {
            mForecasts = getForecasts();
            return null;
        }

        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);
            // mForecasts is populated and does contain data
            mIntent.putExtra(StartUpActivity.FORECAST_KEY, mForecasts);

            // mForecasts in not located in mIntent
            startActivity(mIntent);
            finish();
        }

        // Other methods omitted
    }
}

MainActivity.java

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    setSupportActionBar(mToolbar);

    intent.getParcelableArrayExtra(StartUpActivity.FORECAST_KEY);

    Parcelable[] allForecastParcelables = getIntent().getParcelableArrayExtra(StartUpActivity.FORECAST_KEY);
    if (allForecastParcelables != null) {
        mForecasts = new Forecast[allForecastParcelables.length];
        for (int i = 0 ; i < allForecastParcelables.length; i++) {
            mForecasts[i] = (Forecast) allForecastParcelables[i];
        }
    }
    else {
        mForecasts = null;
    }
    setupSlidingTabs();
}

这是我实现 Parcelable 的模型对象

Forecast.java

public class Forecast implements Parcelable{

Day[] mDays;

public Day[] getDailyForecast() {
    return mDays;
}

public void setDailyForecast(Day[] days) {
    mDays = days;
}


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

public Forecast() {}

private Forecast(Parcel in) {
   in.readTypedArray(mDays, Day.CREATOR);
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeTypedArray(mDays, flags);

}
public static final Creator<Forecast> CREATOR = new Creator<Forecast>() {
    @Override
    public Forecast createFromParcel(Parcel source) {
        return new Forecast(source);
    }

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

Day.java

public class Day 实现 Parcelable {

private Hour[] mHours;
private Average mAverage;

public Hour[] getHourlyForecast() {
    return mHours;
}

public void setHourlyForecast(Hour[] hours) {
    mHours = hours;
}

public Average getAverageForecast() {
    return mAverage;
}

public void setAverageForecast(Average average) {
    mAverage = average;
}

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

private Day(Parcel in) {
    in.readTypedArray(mHours, Hour.CREATOR);
    mAverage = in.readParcelable(getClass().getClassLoader());
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeTypedArray(mHours, flags);
    dest.writeParcelable(mAverage, flags);

}
public static final Creator<Day> CREATOR = new Creator<Day>() {
    @Override
    public Day createFromParcel(Parcel source) {
        return new Day(source);
    }

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

Average.java 公共类 Average 实现 Parcelable {

private String mWindCompassDireciton;

public String getWindCompassDireciton() {
    return mWindCompassDireciton;
}

public void setWindCompassDireciton(String windCompassDireciton) {
    mWindCompassDireciton = windCompassDireciton;
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(mWindCompassDireciton);
}

public Average() {}

private Average(Parcel in) {
    mWindCompassDireciton = in.readString();

}

public static final Creator<Average> CREATOR = new Creator<Average>() {
    @Override
    public Average createFromParcel(Parcel source) {
        return new Average(source);
    }

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

并且Hour类似于average.java

有什么我忽略的吗?

【问题讨论】:

    标签: java android arrays android-asynctask parcelable


    【解决方案1】:

    parcelable 对象中的每个 ArrayList 和对象也应该是可和平的,检查这个example。但我建议您发送 GSON 并将其转换为字符串,并将其作为字符串在活动之间发送,然后再次将其转换为您的对象,检查此 example

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 2018-12-15
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      相关资源
      最近更新 更多