2015-12-07 3 views
2

Я хочу передать объект из одной активности в другую. Отправка только строк и массивов будет болью в заднице, так как мой объект содержит вектор с некоторыми другими объектами. Я пытаюсь и читаю часами, но я просто не могу заставить его работать.Прохождение Serializable от одного действия к другому не работает

// Room.java the object I want to send 
public class Room implements Serializable { 
    private int heating; 
    private boolean light; 
    private String id; 
    private String name; 

    // A list of additional devices, may be empty 
    private Vector<Device> devices = new Vector(); 

    ... 
} 

// HomeScreen.java - here I call my intent to switch to RoomScreen 
public void onOpenRoom(View view) { 
    Intent myIntent = new Intent(this, RoomScreen.class); 
    Room testRoom = new Room("1", "test", 1, true); 

    mBundle.putSerializable("roomObject", testRoom); 
    myIntent.putExtras(mBundle); 

    startActivity(myIntent); 
} 

// RoomScreen.java This is the activity where I want to use the passed object 
public class RoomScreen extends AppCompatActivity { 
    private Room room; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_room); 

    room = (Room) getIntent().getSerializableExtra("roomObject"); 

    getSupportActionBar().setTitle(room.getName()); 
    createElements(); 
} 

Однако я всегда получаю ошибку

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String automaton.automaton.Room.getName()' on a null object reference 

Я также пытался получать объект с

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_room); 

    Bundle myBundle = getIntent().getBundleExtra("roomObject"); 
    room = (Room) myBundle.getSerializable("roomObject"); 

    getSupportActionBar().setTitle(room.getName()); 
    createElements(); 
} 

Тогда я получаю

java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.Serializable android.os.Bundle.getSerializable(java.lang.String)' on a null object reference 

Что я делаю неправильно?

Полный код для Room.java

public class Room implements Serializable { 
private static final long serialVersionUID = 7526472295622776147L; 
private int heating; 
private boolean light; 
private String id; 
private String name; 

// A list of additional devices, may be empty 
private Vector<Device> devices = new Vector(); 

public Room() { 

} 

/** 
* Sets initial heating and light 
* 
* @param heating 
* @param light 
*/ 
public Room(String id, String name, int heating, boolean light) { 
    this.id = id; 
    this.heating = heating; 
    this.light = light; 
    this.name = name; 
} 

public boolean getLight() { 
    return this.light; 
} 

public int getHeating() { 
    return this.heating; 
} 

public String getName() { 
    return this.name; 
} 

/** 
* Adds a new device to the room. 
* 
* @param device 
*/ 
public void addDevice(Device device) { 
    this.devices.add(device); 
} 

/** 
* Searches and returns a device by its id 
* 
* @param id 
* @return Device 
* @throws NoSuchElementException 
*/ 
public Device getDeviceById(String id) throws NoSuchElementException { 
    boolean found = false; 
    int foundAt = 0; 

    for(int i = 0; i < devices.size(); i++) { 
     if(devices.elementAt(i).getId() == id) { 
      found = true; 
      foundAt = i; 
      break; 
     } 
    } 

    if(found) return devices.elementAt(foundAt); 
    else throw new NoSuchElementException("Device not found!"); 
} 

/** 
* Returns all devices attached to the room 
*/ 
public Vector<Device> getDevices() { 
    return this.devices; 
} 

/** 
* Returns the id of the room. 
* 
* @return 
*/ 
public String getId() { 
    return this.id; 
} 
} 
+0

хорошо в первую очередь связывают ВЕСЬ код для объекта, реализует сериализуемое это, где мы найдем вашу ошибку –

+0

Да, мы не видим, где объект создается. –

+2

Возможно, вы также захотите рассмотреть возможность использования Parcelable вместо Serializable. –

ответ

1

Я также рекомендовал бы вам рассмотреть вопрос об использовании более оптимизированный Parcelable интерфейс.

Но это не проблема, которая вызвала у вас NPE. Неправильно указан способ, которым вы пытались прикреплять и извлекать объект комнаты.

UPDATE:

Приложить сериализации объекта как это:

Intent myIntent = new Intent(this, RoomScreen.class); 
Room testRoom = new Room("1", "test", 1, true); 
myIntent.putExtra("roomObject", testRoom); 

И, получить объект вроде этого:

Bundle bundle = intent.getExtras(); 
if (bundle != null) { 
    room = (Room) bundle.getSerializable("roomObject"); 
} 
+0

Спасибо за ответ, но, как оказалось, дополнительные функции всегда равны нулю. Я попробую это с разумным завтра .. – user2018648

+1

Извините, я пропустил еще одну проблему в вашем коде (вы забыли инициализировать объект mBundle?). Вы можете попробовать обновленный ответ. Таким образом, вам не нужно явно инициализировать пакет самостоятельно. –

+0

Вы имеете в виду getIntent(). GetExtras(); а не просто намерение? Он по-прежнему не работает, extras ist null. – user2018648

Смежные вопросы