Eigener Datentyp zwischen Activitys übergeben

M

mybecks

Ambitioniertes Mitglied
3
Hallo zusammen,

Vorneweg, ich weiß das es hier einen ähnlichen Thread gibt, aber dieser befasst sich nur mit den simplen Datentypen.

Ich habe mir einen eigenen erstellt, den ich nach Beendigung eines WS Calls mit dem Result fülle.

EntryList.java:
PHP:
public class EntryList{
    
    private ArrayList<String> date = new ArrayList<String>();

    public EntryList(){
        super();
    }

    public ArrayList<String> getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date.add(date);
    }
}
Wenn ich jetzt das Interface Parcable implementiere, hab ich momentan ein kleines Verständnisproblem wie ich die Methode writeToParcel aus programmieren soll.

Mein Versuch:
PHP:
@Override
    public void writeToParcel(Parcel dest, int flags) {
        int size = date.size();
        
        dest.writeInt(size);
        
        for(int i=0; i<size; i++){
            dest.writeString(date.get(i));
        }
    }
Wenn ich dann folgendes Verusche:
A
PHP:
Bundle b = new Bundle();
                    
                    b.putParcelable("parcable", entryList);
                    
                    intent = new Intent(<ClassFrom>.this, <ClassDest>.class);
                    intent.putExtra("bundle", b);
                    
                    startActivity(intent);
B
PHP:
Bundle b = getIntent().getExtras();
        entryList = b.getParcelable("parcable");
        Toast.makeText(this, "Size of EntryList: "+entryList.getDate().size(), Toast.LENGTH_SHORT).show();
bekomm ich bei B immer eine wunderschöne NullPointer um die Ohren gehauen. Bloß ich hab kein Plan wie ich meine EntryList serializieren bzw. korrekt in ein Parcel verpackt bekomme.

Habe mich ein wenig an dem Tutorial bei anddev.org orientiert. Aber da ist es vom Aufbau her anderster. Wisst ihr wie ich meinen eigenen DT verschicken kann?

Vielen Dank & Grüße,
mybecks
 
In den FAQs bei Android gibt's eine schöne Beschreibung für dein Anliegen:

Android Application Framework FAQ | Android Developers

Falls du es mit Parcelable lösen möchest brauchst du in deiner EntryList noch ein statisches Feld namens CREATOR, hinter dem sich der "Erbauer" deines Parcels verbirgt. Einfacher geht es wie im Link beschrieben.
 
was ist denn unter punkt hashMap gemeint?

A HashMap of WeakReferences to Objects

You can also use a HashMap of WeakReferences to Objects with Long keys. When an activity wants to pass an object to another activity, it simply puts the object in the map and sends the key (which is a unique Long based on a counter or time stamp) to the recipient activity via intent extras. The recipient activity retrieves the object using this key.

soll das auch ein
A public static field/method


sein oder was meinen die damit?

Gruß
 
mr.freeze schrieb:
was ist denn unter punkt hashMap gemeint?



soll das auch ein
A public static field/method


sein oder was meinen die damit?

Gruß
Es klingt so, als würden sie das meinen. Welche Vorteile das gegenüber eines einfach als static deklarierten Members hat kann ich dir aber nicht sagen.
 
Hat jemand eine Lösung für das Problem?
 
Ja, die Klasse hab ich auch schon so weit erweitert, nur hab ich keine Ahnung wie ich es hin und her "schieben" kann. Ich bekomme beim lesen des Objekts immer nur null.
 
OK, mein Problem ist vielleicht ein kleines bißchen anders: Ich will keine Liste schicken, sondern ein einzelnes Objekt. Hab da folgende Klasse und wie ich es schicke und empfange:
PHP:
public class Warunek implements Parcelable {
  ...
  public Warunek() {
  }
    
  public Warunek(Parcel in){
      readFromParcel(in);
  }

  @Override
  public void writeToParcel(Parcel out, int flags) {
      out.writeValue(this); // hier kommt 05-24 09:32:13.124: ERROR/AndroidRuntime(477): java.lang.StackOverflowError
  }
    
  public void readFromParcel(Parcel in) {
      Warunek w = (Warunek) in.readValue(new ClassLoader() {
      });
      ...
  }

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

      public Warunek[] newArray(int size) {
          return new Warunek[size];
      }
    };
}
Senden:
PHP:
Intent i = new Intent(getApplicationContext(), WarunekMapView.class);
                
Bundle b = new Bundle();
b.putParcelable("warunek", (Warunek)lv.getItemAtPosition(position)); // ein Objekt aus dem ListView
i.putExtra("bundle", b);
                
startActivity(i);
Empfangen:
PHP:
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
        
   ...

   Bundle b = getIntent().getExtras();
   Warunek w = b.getParcelable("warunek");

   System.out.println(warunek);
   ...
}
 
Zuletzt bearbeitet:
out.writeValue(this);

Das ist das Problem. Lies mal die Doku: Parcel | Android Developers)

Da können wiederum nur parcelable Objekte übergeben werden. In ein parcel solltest du die (primitiven) Member deines Objekts schreiben.
 
Gelesen hab ich das. Klasse ist Parcelable und das Parcel bietet ja ein writeValue(Object o) ja an. Und mit this schick ich ihm doch auch ein Objekt, oder verstehe ich da was falsch?

Edit: Ja, ich verstehe da was falsch... :)
 
Zuletzt bearbeitet:
Dein Problem ist eine indirekte Rekursion:

Über die Methode writeToParcel legst du ja fest, wie genau dein Objekt serialisiert werden soll.
Du sagst einfach: Hey, schreib dich selbst -> out.writeValue(this).
Also sagt sich das System: "Super, dann frage ich das übergebene Objekt (this), wie es sich serialisiert" -> "Ja schreib mich selbst" -> "Wie mache ich das?" -> "Schreib mich selbst" -> ... uswusf. bis zum StackOverflow.

In DEINER writeToParcel-Methode wird erwartet, wie genau, in allen Einzelheiten, sich das Objekt serialisieren soll - idealerweise runtergebrochen auf die einzelnen Member.
 

Ähnliche Themen

FabianDev
Antworten
5
Aufrufe
559
swa00
swa00
R
  • RudolfHagen
Antworten
1
Aufrufe
652
koje71
koje71
M
Antworten
3
Aufrufe
168
moin
M
Zurück
Oben Unten