2014-02-17 5 views
0

У меня есть внешняя библиотека Java с множеством общих объектов (например, пользователь с именем, фамилией, адресом ...). То, что я хочу создать, является классом сериализатора (de), который преобразует все мои объекты в объекты Parcelable для отправки с помощью Intents. Проблема в том, что намерения Android не поддерживают putExtra (String, Parcel) или что-то подобное. У вас есть идея о том, как преодолеть это неудобство? На самом деле я помещаю все свои экземпляры в класс Application, но я думаю, что это грязный метод ... более чистый?Parcelable encoder/decoder (Внешний класс)

+0

Создать класс модели и поместить все соответствующие данные в нем и сделать его parcelable. По строке примечания по умолчанию сериализуем взглянем на класс строчки android – Triode

+0

У меня только сериализатор Json (de), но эффективен ли он? Мне нравится иметь всегда чистые решения ... Проблема в том, что я получаю эти объекты над JSon, поэтому у меня есть User user = json.decode (string); Теперь я хочу посылить его ParcelableUser puser = (ParcelableUser) пользователь; Но теперь я не могу использовать эту кастинг из-за ограничений Java над линией подкласса. – Otacon

+0

u сделайте этот пользовательский класс разумным, на Android, который называется чистым решением – Triode

ответ

2

Вы можете использовать метод Intent putExtras(Bundle extras) и реализовать в своем методе класса exportToBundle(), который возвращает Bundle со значениями этого объекта. Если вы не хотите создавать какие-либо другие методы в своем классе, вы можете создать другой класс утилиты со статическим методом, который преобразует объект вашего класса в Bundle. И если ваш класс Parcelable, вы можете поместить его прямо в Bundle, используя метод putParcelable(String key, Parcelable value).

0

Вы можете прямо поставить класс Parcelable в цель, так что то, что вы ищете, поддерживается. Здесь есть слово предупреждения, и я думаю, что у вас уже есть эта концепция, упомянув сериализацию/де-сериализацию. Вы отправляете копию класса, который будет восстановлен классом, обрабатывающим намерение. The official android example is weak because only one integer is sent and we can do that already.

Пример Цель прохождение класса

 Intent intent = new Intent(context, TheClassImCalling.class); 
      // use a constant that's public or an R string so both the sender 
      // and receiver are working on the same class 
      // the class you are sending goes into the putExtra method statement. 
    intent.putExtra(ImageTextListViewActivity.EXTRA_KMLSUMMARY, 
    mKmlSummary); 
    startActivity(intent); 

Вы вытащить копию из класса с заявлением, как это, используя ту же константу вы использовали, чтобы отправить его.

KMLSummary mkmlSummary = intent.getExtras().getParcelable(
       ImageTextListViewActivity.EXTRA_KMLSUMMARY); 

Вот методы, которые должны быть реализованы

public class KmlSummary implements Parcelable { 

// конструктор с Parcel в качестве аргумента. // Вы читаете и записываете значения в том же порядке.

public KmlSummary(Parcel in) { 
    this._id = in.readInt(); 
    this._description = in.readString(); 
    this._name = in.readString(); 
    this.set_bounds(in.readDouble(), in.readDouble(), in.readDouble(), 
      in.readDouble()); 
    this._resrawid = in.readInt(); 
    this._resdrawableid = in.readInt(); 
    this._pathstring = in.readString(); 
    String s = in.readString(); 
    this.set_isThumbCreated(Boolean.parseBoolean(s)); 
} 


// Overridden methods for the Parseable interface. 
@Override 
public void writeToParcel(Parcel arg0, int arg1) { 
    arg0.writeInt(this._id); 
    arg0.writeString(this._description); 
    arg0.writeString(this._name); 
    arg0.writeDouble(this.get_bounds().southwest.latitude); 
    arg0.writeDouble(this.get_bounds().southwest.longitude); 
    arg0.writeDouble(this.get_bounds().northeast.latitude); 
    arg0.writeDouble(this.get_bounds().northeast.longitude); 
    arg0.writeInt(this._resrawid); 
    arg0.writeInt(this._resdrawableid); 
    arg0.writeString(this.get_pathstring()); 
    String s = Boolean.toString(this.isThumbCreated()); 
    arg0.writeString(s); 
} 

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


    // Some glue to tell the OS how to create the class from the parcel 
@SuppressWarnings("rawtypes") 
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 
    public KmlSummary createFromParcel(Parcel in) { 
     return new KmlSummary(in); 
    } 

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

Именно поэтому вы можете сериализовать класс в намерение и де-сериализовать класс из намерения.

Good Luck Danny117

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