2013-01-15 9 views
45

Ich habe meine Klasse mit Serializable implementiert, aber es hat immer noch nicht funktioniert.Weitergabe von Daten durch Intent mit Serializable

Das ist meine Klasse:

package com.ursabyte.thumbnail; 

import java.io.Serializable; 

import android.graphics.Bitmap; 

public class Thumbnail implements Serializable { 

    private static final long serialVersionUID = 1L; 
    private String label = ""; 
    private Bitmap bitmap; 

    public Thumbnail(String label, Bitmap bitmap) { 
     this.label = label; 
     this.bitmap = bitmap; 
    } 

    public void set_label(String label) { 
     this.label = label; 
    } 

    public String get_label() { 
     return this.label; 
    } 

    public void set_bitmap(Bitmap bitmap) { 
     this.bitmap = bitmap; 
    } 

    public Bitmap get_bitmap(){ 
     return this.bitmap; 
    } 

    // @Override 
    // public int compareTo(Thumbnail other) { 
    //  if(this.label != null) 
    //   return this.label.compareTo(other.get_label()); 
    //  else 
    //   throw new IllegalArgumentException(); 
    // } 

} 

Dies ist, was ich vorbei werden soll.

List<Thumbnail> all_thumbs = new ArrayList<Thumbnail>(); 
all_thumbs.add(new Thumbnail(string, bitmap)); 
Intent intent = new Intent(getApplicationContext(), SomeClass.class); 
intent.putExtra("value", all_thumbs); 

Aber immer noch hat es nicht funktioniert. Ich weiß nicht, wie Parcelable zu verwenden ist, also verwende ich das stattdessen.

+2

'Bitmap' Klasse nicht implementiert' Serializable'. Sie müssen hier "Parcelable" verwenden. Es ist jedoch keine gute Idee, Bitmaps mit 'Parcelable' zu ​​übergeben. –

+0

Was ist mit Byte-Array? implementiert es Serializable? –

+0

ja, aber sei vorsichtig mit großen Objekten. Intent hat eine Größenbeschränkung für Extras –

Antwort

106

Versuchen Sie, die serializable Liste passieren Bundle.Serializable mit:

Bundle bundle = new Bundle(); 
bundle.putSerializable("value", all_thumbs); 
intent.putExtras(bundle); 

Und in Someclass Aktivität erhalten als:

Intent intent = this.getIntent(); 
Bundle bundle = intent.getExtras(); 

List<Thumbnail> thumbs= 
       (List<Thumbnail>)bundle.getSerializable("value"); 
+2

Ich habe diesen Fehler: java.lang.RuntimeException: Parcelable aufgetreten IOException Schreiben serializable Objekt (Name = com.ursabyte.thumbnail.Thumbnail) –

+0

@TEgaralaga: siehe dieses Beispiel http: //www.cnblogs .com/jsonxing/archive/2011/08/17/2143458.html –

+0

Das Problem ist Bitmap Klasse implementiert keine Serialization wie @vmironov sagte :) –

0

Sie benötigen einen Bundle und dann auf sie verwenden, um erstellen putSerializable:

List<Thumbnail> all_thumbs = new ArrayList<Thumbnail>(); 
all_thumbs.add(new Thumbnail(string,bitmap)); 
Intent intent = new Intent(getApplicationContext(),SomeClass.class); 

Bundle extras = new Bundle(); 

extras.putSerializable("value",all_thumbs); 
intent.putExtras(extras); 
2
Intent intent = new Intent(getApplicationContext(),SomeClass.class); 
intent.putExtra("value",all_thumbs); 
startActivity(intent); 

In SomeClass.java

Bundle b = getIntent().getExtras(); 
if(b != null) 
thumbs = (List<Thumbnail>) b.getSerializable("value"); 
1

Ihr Objekt individuelle Erstellen und Serializable implementieren. Als nächstes können Sie intent.putExtra ("package.name.example",) verwenden.

In der zweiten Aktivität lesen Sie es mit getIntent(). GetSerializableExtra ("package.name.example").

Andernfalls folgen Sie this und this Seite.

3

Ich erweiterte κяσѕρєя K's Antwort, um es voll und bearbeitbaren Code zu machen. Also, wenn Sie Ihre 'all_thumbs Liste fertig füllen, sollten Sie ihren Inhalt eins nach dem anderen in das Bündel legen und dann in der Absicht:

Bundle bundle = new Bundle(); 

for (int i = 0; i<all_thumbs.size(); i++) 
bundle.putSerializable("extras"+i, all_thumbs.get(i)); 

intent.putExtras(bundle); 

Um die Extras von der Absicht zu erhalten, benötigen Sie:

Bundle bundle = new Bundle(); 
List<Thumbnail> thumbnailObjects = new ArrayList<Thumbnail>(); 

// collect your Thumbnail objects 
for (String key : bundle.keySet()) { 
thumbnailObjects.add((Thumbnail) bundle.getSerializable(key)); 
} 

// for example, in order to get a value of the 3-rd object you need to: 
String label = thumbnailObjects.get(2).get_label(); 

Vorteil von Serializable ist seine Einfachheit. Allerdings würde ich Ihnen empfehlen, Parcelable Methode zu verwenden, wenn Sie viele Daten übertragen müssen, denn Parcelable ist speziell für Android entwickelt und es ist effizienter als Serializable. Sie können Parcelable Klasse erstellen mit:

  1. ein Online-Tool - parcelabler
  2. ein Plugin für Android Studion - Android Parcelable code generator
7

Dieser Code kann Ihnen helfen:

public class EN implements Serializable { 
//... you don't need implement any methods when you implements Serializable 
} 

Daten eingeben. Erstellen Sie neue Aktivität mit Extra:

EN enumb = new EN(); 
Intent intent = new Intent(getActivity(), NewActivity.class); 
intent.putExtra("en", enumb); //second param is Serializable 
startActivity(intent); 

Daten zu erhalten von neuer Aktivität:

public class NewActivity extends Activity { 

    private EN en; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     try { 
      super.onCreate(savedInstanceState); 

      Bundle extras = getIntent().getExtras(); 
      if (extras != null) { 
       en = (EN)getIntent().getSerializableExtra("en"); //Obtaining data 
      } 
//... 
+1

Das Objekt "en" ist NULL-fähig – brunoramonalmeida

Verwandte Themen