0

我想通過intent從NewContact類的RecyclerView保存Contacto的項目。在我的Contactos類中,我有一個位圖,並且我知道這是錯誤,因爲之前沒有位圖。怎麼了?寫入可序列化對象時出錯(位圖包含)

Contactos類:

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import java.io.Serializable; 

public class Contactos implements Serializable{ 
private String Nombre; 
private String Apellidos; 
private String Telefono; 
private String Correo; 
private Bitmap Foto; 


public Contactos(){ 

} 
public Contactos(String nombre, String apellidos, String telefono, String correo) { 
    Nombre = nombre; 
    Apellidos = apellidos; 
    Telefono = telefono; 
    Correo = correo; 

} 

public Contactos(String nombre, String apellidos, String telefono, String correo, Bitmap foto) { 
    Nombre = nombre; 
    Apellidos = apellidos; 
    Telefono = telefono; 
    Correo = correo; 
    Foto = foto; 
} 

public String getNombre() { 
    return Nombre; 
} 

public void setNombre(String nombre) { 
    Nombre = nombre; 
} 

public String getApellidos() { 
    return Apellidos; 
} 

public void setApellidos(String apellidos) { 
    Apellidos = apellidos; 
} 

public String getTelefono() { 
    return Telefono; 
} 

public void setTelefono(String telefono) { 
    Telefono = telefono; 
} 

public String getCorreo() { 
    return Correo; 
} 

public void setCorreo(String correo) { 
    Correo = correo; 
} 

public Bitmap getFoto() { 
    return Foto; 
} 

public void setFoto(Bitmap foto) { 
    Foto = foto; 
} 

} 

和Holder類:

import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.support.v7.widget.RecyclerView; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.TextView; 


public class Holder extends RecyclerView.ViewHolder { 
TextView txtnombre; 
TextView txtapellido; 
TextView txttelefono; 
TextView txtemail; 
ImageView iVFoto; 

public Holder(View itemView) { 
    super(itemView); 
    txtnombre = (TextView)itemView.findViewById(R.id.txtNombre); 
    txtapellido = (TextView)itemView.findViewById(R.id.txtApellidos); 
    txttelefono = (TextView)itemView.findViewById(R.id.txtTelefono); 
    txtemail = (TextView)itemView.findViewById(R.id.txtCorreo); 
    iVFoto = (ImageView)itemView.findViewById(R.id.foto); 
} 

public void bind(Contactos c){ 
    txtnombre.setText(c.getNombre()); 
    txtapellido.setText(c.getApellidos()); 
    txttelefono.setText(c.getTelefono()); 
    txtemail.setText(c.getCorreo()); 
    //iVFoto.setImageDrawable(new BitmapDrawable(getResources(), c.getFoto())); me marca en ROJO getResources() y me pone que está en desuso(tachado) BitmapDrawable 
    iVFoto.setImageDrawable(new BitmapDrawable(c.getFoto())); 

} 

public TextView getTxtnombre() { 
    return txtnombre; 
} 

public TextView getTxtapellido() { 
    return txtapellido; 
} 

public TextView getTxttelefono() { 
    return txttelefono; 
} 

public TextView getTxtemail() { 
    return txtemail; 
} 

public ImageView getiVFoto() { 
    return iVFoto; 
} 
} 

而且logcat的

11-06 10:04:48.185 28245-28245/com.example.jorge.ejerciciopropuestoagenda E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.jorge.ejerciciopropuestoagenda, PID: 28245 
    java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.jorge.ejerciciopropuestoagenda.Contactos) 
      at android.os.Parcel.writeSerializable(Parcel.java:1394) 
      at android.os.Parcel.writeValue(Parcel.java:1341) 
      at android.os.Parcel.writeArrayMapInternal(Parcel.java:644) 
      at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313) 
      at android.os.Bundle.writeToParcel(Bundle.java:1034) 
      at android.os.Parcel.writeBundle(Parcel.java:669) 
      at android.content.Intent.writeToParcel(Intent.java:7496) 
      at android.app.ActivityManagerProxy.finishActivity(ActivityManagerNative.java:2725) 
      at android.app.Activity.finish(Activity.java:4662) 
      at android.app.Activity.finish(Activity.java:4680) 
      at com.example.jorge.ejerciciopropuestoagenda.NuevoContacto.onClick(NuevoContacto.java:55) 
      at android.view.View.performClick(View.java:4785) 
      at android.view.View$PerformClick.run(View.java:19884) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5343) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 
    Caused by: java.io.NotSerializableException: android.graphics.Bitmap 
      at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344) 
      at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651) 
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497) 
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461) 
      at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959) 
      at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360) 
      at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054) 
      at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384) 
      at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651) 
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497) 
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461) 
      at android.os.Parcel.writeSerializable(Parcel.java:1389) 
            at android.os.Parcel.writeValue(Parcel.java:1341) 
            at android.os.Parcel.writeArrayMapInternal(Parcel.java:644) 
            at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313) 
            at android.os.Bundle.writeToParcel(Bundle.java:1034) 
            at android.os.Parcel.writeBundle(Parcel.java:669) 
            at android.content.Intent.writeToParcel(Intent.java:7496) 
            at android.app.ActivityManagerProxy.finishActivity(ActivityManagerNative.java:2725) 
            at android.app.Activity.finish(Activity.java:4662) 
            at android.app.Activity.finish(Activity.java:4680) 
            at com.example.jorge.ejerciciopropuestoagenda.NuevoContacto.onClick(NuevoContacto.java:55) 
            at android.view.View.performClick(View.java:4785) 
            at android.view.View$PerformClick.run(View.java:19884) 
            at android.os.Handler.handleCallback(Handler.java:739) 
            at android.os.Handler.dispatchMessage(Handler.java:95) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5343) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 

回答

1

產生的原因:java.io.NotSerializableException:android.graphics。位圖

所以位圖不是一個可序列化的對象。您可以添加關鍵字transient爲了告訴Java不序列它

private transient Bitmap Foto; 

從這個thread

Java中的瞬態關鍵字用來表明某個字段不應被序列化。

你也應該考慮使用的Parcelable代替Serializable當你使用Android(見本threaddoc

使用Parcelable可以存儲/使用檢索位圖(從[這裏]」 How To: Parcel a bitmap in Android))

//Store 
Parcel parcel = Parcel.obtain(); 
Bitmap sourceBitmap = Bitmap.createBitmap(200, 400, Config.ARGB_8888); 
sourceBitmap.writeToParcel(parcel, 0); 

//Retrieve 
parcel.setDataPosition(0); 
Bitmap destinationBitmap = Bitmap.CREATOR.createFromParcel(parcel); 
0

對於使用Serializable接口不支持位圖,如果你使用序列化,你需要將其轉換成

bmp.compress(Bitmap.CompressFormat.PNG, 90,outputStream); 

否則它能夠更好地使用Parcelable:

public class Contactos implements Parcelable { 

    private String Nombre; 
    private String Apellidos; 
    private String Telefono; 
    private String Correo; 
    private Bitmap Foto; 

    public Contactos() { 

    } 

    public Contactos(String nombre, String apellidos, String telefono, String correo) { 
     Nombre = nombre; 
     Apellidos = apellidos; 
     Telefono = telefono; 
     Correo = correo; 
    } 

    public Contactos(String nombre, String apellidos, String telefono, String correo, Bitmap foto) { 
     Nombre = nombre; 
     Apellidos = apellidos; 
     Telefono = telefono; 
     Correo = correo; 
     Foto = foto; 
    } 

    protected Contactos(Parcel in) { 
     Nombre = in.readString(); 
     Apellidos = in.readString(); 
     Telefono = in.readString(); 
     Correo = in.readString(); 
     Foto = in.readParcelable(Bitmap.class.getClassLoader()); 
    } 

    public static final Creator<Contactos> CREATOR = new Creator<Contactos>() { 
     @Override 
     public Contactos createFromParcel(Parcel in) { 
      return new Contactos(in); 
     } 

     @Override 
     public Contactos[] newArray(int size) { 
      return new Contactos[size]; 
     } 
    }; 

    public String getNombre() { 
     return Nombre; 
    } 

    public void setNombre(String nombre) { 
     Nombre = nombre; 
    } 

    public String getApellidos() { 
     return Apellidos; 
    } 

    public void setApellidos(String apellidos) { 
     Apellidos = apellidos; 
    } 

    public String getTelefono() { 
     return Telefono; 
    } 

    public void setTelefono(String telefono) { 
     Telefono = telefono; 
    } 

    public String getCorreo() { 
     return Correo; 
    } 

    public void setCorreo(String correo) { 
     Correo = correo; 
    } 

    public Bitmap getFoto() { 
     return Foto; 
    } 

    public void setFoto(Bitmap foto) { 
     Foto = foto; 
    } 

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

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(Nombre); 
     dest.writeString(Apellidos); 
     dest.writeString(Telefono); 
     dest.writeString(Correo); 
     dest.writeParcelable(Foto, flags); 
    } 
} 

希望它爲你工作。

相關問題