【问题标题】:Why passed to another activity Serializable object is null为什么传递给另一个活动的可序列化对象为空
【发布时间】:2017-01-30 12:23:45
【问题描述】:

我已经尝试在活动之间传递对象,就像在 How to pass an object from one activity to another on Android 中一样

并且 SerializableTask 正在正确创建,但是当我想在下一个活动中读取它时它为空。

    Task task = listOfTask.get(position);
    Log.i(TAG, "recyclerViewEditTask: edit clicked for title: " +
                                        task.getTitle());
    SerializabledTask sTask = new SerializabledTask(task.getTitle(),
        task.getDetails(), task.getTimeToDo(), task.getTag(),
        task.getId(), task.isDone());
    if(sTask == null)
        Log.e(TAG, "recyclerViewEditTask: sTask IS NULL");
    else {
        Log.i(TAG, "recyclerViewEditTask: sTaskInfo: " + sTask.toString());
        Intent editIntent = new Intent(ListOfTasksActivity.this, EditTaskActivity.class);
        editIntent.putExtra("task", sTask);
        startActivity(editIntent);

然后它去另一个活动

尝试获取可序列化对象的活动:

Intent i = getIntent();
SerializabledTask sTask = (SerializabledTask) i.getSerializableExtra("task");
if(sTask == null)
    Log.e(TAG, "onCreate: sTASK IS NULL" );

并且“onCreate: sTASK IS NULL”正在调用

当我尝试传递单个字符串时,它可以正常工作

可序列化类:

public class SerializabledTask implements Serializable {

String title, details, timeToDo, tag;
int id;
boolean done;
Task task;

public SerializabledTask(String title, String details, String timeToDo, String tag, int id, boolean done) {
    this.title = title;
    this.details = details;
    this.timeToDo = timeToDo;
    this.tag = tag;
    this.id = id;
    this.done = done;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getDetails() {
    return details;
}

public void setDetails(String details) {
    this.details = details;
}

public String getTimeToDo() {
    return timeToDo;
}

public void setTimeToDo(String timeToDo) {
    this.timeToDo = timeToDo;
}

public String getTag() {
    return tag;
}

public void setTag(String tag) {
    this.tag = tag;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public boolean isDone() {
    return done;
}

public void setDone(boolean done) {
    this.done = done;
}

public Task getTask() {
    return task;
}

public void setTask(Task task) {
    this.task = task;
}

@Override
public String toString() {
    return "SerializabledTask{" +
            "title='" + title + '\'' +
            ", details='" + details + '\'' +
            ", timeToDo='" + timeToDo + '\'' +
            ", tag='" + tag + '\'' +
            ", id=" + id +
            ", done=" + done +
            ", task=" + task +
            '}';
}

【问题讨论】:

  • 您的任务类是什么,邮政编码?是否实现了可序列化?
  • Task 是一个简单的类,包含“title”、“details”、“timeToDo”、“tag” - String、“id” - Int、“done” - 布尔值。它还具有这些属性和 toString 方法的 getter。但我认为这并不重要,因为 Task 正在从回收站视图正确分配, SerializabledTask 正在正确分配并且它具有 Task 具有的价值。问题在于在另一个活动中读取 SerializabledTask。
  • 这意味着你正在实现 SerializableSerializableTask 类。并且该类具有Task 类的对象。对吗?
  • @AmrutBidri 我编辑了我的问题并粘贴了我的整个 SerializabledTask
  • 添加此代码,private void writeObject(java.io.ObjectOutputStream out) throws IOException { out.writeObject(task); } private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { task= (Task) in.readObject(); }

标签: java android serialization


【解决方案1】:

您的模型类 SerializableTask 必须实现 Serializable 才能使您的代码正常工作。

public class SerializableTask implements Serializable {
...
}

此外,强烈建议使用 Parcelable 而不是 Serializable,因为它要快得多。 来源:http://www.developerphil.com/parcelable-vs-serializable/

【讨论】:

  • 我的 SerializableTask 实现的 Serializable 与我在非常开始的问题中链接的问题完全一样
猜你喜欢
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多