2013-01-15 32 views
45

我已經使用可序列化實現了我的類,但它仍然無法工作。使用可串行化通過意圖傳遞數據

這是我的課:

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(); 
    // } 

} 

這是我想被路過的東西。

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); 

但仍然沒有奏效。我不知道如何使用Parcelable,所以我用它來代替。

+2

'Bitmap'類未實現'Serializable'。你必須在這裏使用'Parcelable'。然而,使用'Parcelable'傳遞位圖不是一個好主意...... –

+0

字節數組呢?它是否實現了Serializable? –

+0

是的,但要注意大型物體。意圖有額外的大小限制 –

回答

106

嘗試使用Bundle.Serializable傳遞序列化的列表:

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

而且在SomeClass的活動爲得到它:

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

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

我得到這個錯誤:java.lang.RuntimeException:Parcelable遇到IOException寫入可序列化的對象(name = com.ursabyte.thumbnail.Thumbnail) –

+0

@tegaralaga:看到這個例子http://www.cnblogs .com/jsonxing/archive/2011/08/17/2143458.html –

+0

問題是位圖類不執行像@vmironov說的Serializabe :) –

0

你需要創建一個Bundle,然後在其上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); 

在SomeClass.java

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

創建自定義的對象,並實現Serializable。接下來,您可以使用intent.putExtra(「package.name.example」,)。

在第二個活動,您使用getIntent()。getSerializableExtra( 「package.name.example」)讀取它。

否則,請按照thisthis頁面。

3

我伸出ρяσѕρєяK公司的回答,使之充分和可行的代碼。所以,當你填完你的「all_thumbs」列表中,你應該把它的內容逐一進入束,然後進入意向:

Bundle bundle = new Bundle(); 

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

intent.putExtras(bundle); 

爲了從意圖得到了羣衆演員,你需要:

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(); 

Serializable的優點是它的簡單性。不過,我會建議你,當你需要傳送多個數據考慮使用Parcelable方法,因爲Parcelable是專門爲Android設計的,它比Serializable更有效。您可以通過創建Parcelable類:

  1. 一個在線工具 - parcelabler
  2. 爲Android Studion插件 - Android Parcelable code generator
7

此代碼可以幫助你:

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

把數據。額外創建新的活動:

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

來自新的活動獲取數據

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

對象「en」是可以空的 – brunoramonalmeida