2013-05-17 5 views
0

다음 클래스가 있습니다 : 실험 및 측정. Experiment 객체를 값으로 사용하는 HashMap과 Experiment.getExperimentName을 키로 전달합니다 (Android 액티비티 간).Java/Android의 오브젝트 해시에 parcel/parcelable을 올바르게 구현하는 방법은 무엇입니까?

이러한 실험 개체에는 차례로 측정 개체의 HashMap이 포함되어 있습니다. 이 HashMap에는 Measurements 객체가 값으로, Measurements.getMeasurements가 키로 있습니다.

이 측정 개체에는 double 형의 ArrayList가 들어 있습니다.

필자는 번들을 사용하거나 직접 소포를 넣는 많은 변형을 시도해 봤지만 새 파일에서 HashMap을 읽을 때 "unmarshalling 할 때 ClassNotFoundException : nl.bioinf.thema12.labpal.objects.Measurements"가 계속 나타납니다. 활동.

필자는 parcel/parcelable을 올바르게 구현할 수 있습니까?

실험 분류 : 번들을 보내는 행위 번들을

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //get the intent passed by the other activity 
    Bundle b = getIntent().getExtras(); 
    experiment = b.getParcelable("nl.bioinf.thema12.labpal.objects.Experiment"); 
    setContentView(R.layout.activity_show_table); 
} 

코드를 수신 활동

package nl.bioinf.thema12.labpal.objects; 
import java.util.HashMap; 
//import java.util.Set; 

import android.os.Bundle; 
import android.os.Parcel; 
import android.os.Parcelable; 

/** 
* @author roy 
* a class which describes an experiment 
*/ 
public class Experiment implements Parcelable{ 
    private String experimentName = ""; 
    private HashMap<String,Measurements> measurements = new HashMap<String,Measurements>(); 

    //every Experiment needs a name to make it unique 
    public Experiment(String experimentName) { 
     this.experimentName=experimentName; 
    } 

    /** 
    * a method which adds values to a measurement 
    * @param measurementName the name of the measurement you want to write a value to 
    * @param measurement the value of the measurement you want to add 
    * @return the sequence from the fasta 
    */ 
    public void addValueToMeasurements(String measurementName, double measurement){ 
     //try to add the measurement 
     if(measurements.get(measurementName)== null){ 
      Measurements m = new Measurements(measurementName); 
      m.addMeasurement(measurement); 
      measurements.put(measurementName,m); 
     } 
     //if the measurement does not exist, create it 
     else{ 
      measurements.get(measurementName).addMeasurement(measurement); 
     } 
    } 
    /** 
    * a method which returns the experiment name 
    * @return the experiment name 
    */ 
    public String getExperimentName(){ 
     return experimentName; 
    } 



    //This makes the object parselable, I don't understand why 
    /** 
    * a constructor for the parcelable variant of the object 
    */  
    public Experiment(Parcel in){ 
     measurements = new HashMap<String,Measurements>(); 
     readFromParcel(in); 
    } 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    /** 
    * a method which writes the objects to a parcel 
    */ 
    public void writeToParcel(Parcel dest, int flags) { 
     //dest.writeString(experimentName); 
     //for(String s: (Set<String>)measurements.keySet()){ 
      //dest.writeString(s); 
      //dest.writeValue(measurements.get(s)); 
     //} 
     Bundle b = new Bundle(); 
     b.putString("experimentName", experimentName); 
     b.putSerializable("measurements", measurements); 
     dest.writeBundle(b); 
    } 

    /** 
    * a method which reads from a parcel 
    */ 
    public void readFromParcel(Parcel in){ 
     //experimentName = in.readString(); 
     Bundle b = in.readBundle(); 
     experimentName = b.getString("experimentName"); 
     measurements = (HashMap<String, Measurements>)b.getSerializable("measurements"); 
    } 

    /** 
    * generic parcelable creator method 
    */ 
    public static final Parcelable.Creator CREATOR = 
     new Parcelable.Creator() { 
      public Experiment createFromParcel(Parcel in) { 
       return new Experiment(in); 
      } 

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


} 

측정 클래스

package nl.bioinf.thema12.labpal.objects; 

import java.util.ArrayList; 

import android.os.Bundle; 
import android.os.Parcel; 
import android.os.Parcelable; 
/** 
* @author roy 
* a class which describes a group of measurements 
*/ 

public class Measurements implements Parcelable{ 
    private ArrayList<Double> measurements; 
    private String measurementName; 

    //each measurement has at least a name and an empty list of measurements 
    public Measurements(String measurementName) { 
     this.measurementName=measurementName; 
     measurements = new ArrayList<Double>(); 
    } 

    /** 
    * a method which adds a measurement to an ArrayList of measurements 
    * @param measurement a measurement to add to the ArrayList 
    */ 
    public void addMeasurement(double measurement){ 
     measurements.add(measurement); 
     System.out.println("added a measurement"); 
    } 

    /** 
    * a method which returns the measurement name 
    * @return the measurement name 
    */ 
    public String getMeasurementName(){ 
     return measurementName; 
    } 

    /** 
    * a method which returns an ArrayList of the values in the measurement 
    * @return the values of the measurements in an ArrayList 
    */ 
    public ArrayList<Double> getMeasurements(){ 
     return measurements; 
    } 

    //This makes the object parselable, I don't understand why 
    /** 
    * a constructor for the parcelable variant of the object 
    */  
    public Measurements(Parcel in){ 
     measurements = new ArrayList<Double>(); 
     readFromParcel(in); 

    } 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    /** 
    * a method which writes the objects to a parcel 
    */ 
    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     //dest.writeString(measurementName); 
     //dest.writeList(measurements); 
     Bundle b = new Bundle(); 
     b.putString("measurementName", measurementName); 
     b.putSerializable("measurements", measurements); 
    } 

    /** 
    * a method which reads from a parcel 
    */ 
    public void readFromParcel(Parcel in){ 
     //measurementName = in.readString(); 
     //measurements = in.readArrayList(Object.class.getClassLoader()); 
     Bundle b = in.readBundle(); 
     measurementName = b.getString("measurementName"); 
     measurements = (ArrayList<Double>)b.getSerializable("measurements"); 
    } 

    /** 
    * generic parcelable creator method 
    */ 
    public static final Parcelable.Creator CREATOR = 
     new Parcelable.Creator() { 
      public Measurements createFromParcel(Parcel in) { 
       return new Measurements(in); 
      } 

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

코드

//setup the table button 
     table = (Button)findViewById(R.id.button_activityMain_table); 
     table.setOnClickListener(new OnClickListener(){ 
      @Override 
      public void onClick(View v){ 
       try{ 
        Intent intentToPassToShowTable = new Intent(MainActivity.this, ShowTable.class); 
        Bundle b = new Bundle(); 
        b.putParcelable("nl.bioinf.thema12.labpal.objects.Experiment", experiments.get(experimentName.getSelectedItem().toString())); 
        intentToPassToShowTable.putExtras(b); 
        startActivity(intentToPassToShowTable); 
       } 
       catch(Exception e){ 
        e.printStackTrace(); 
       } 
      } 
     }); 

답변

1

안녕하세요이 작동하고이 코드를 시도 미세

package com.example.objectsharing; 

import java.util.ArrayList; 
import java.util.HashMap; 

import android.os.Bundle; 
import android.os.Parcel; 
import android.os.Parcelable; 

public class Experiment implements Parcelable { 
private String experimentName = ""; 
private HashMap<String, ArrayList<Double>> measurements = new HashMap<String, ArrayList<Double>>(); 

// every Experiment needs a name to make it unique 
public Experiment(String experimentName) { 
    this.experimentName = experimentName; 
} 

/** 
* a method which adds values to a measurement 
* 
* @param measurementName 
*   the name of the measurement you want to write a value to 
* @param measurement 
*   the value of the measurement you want to add 
* @return the sequence from the fasta 
*/ 
public void addValueToMeasurements(String measurementName, 
     double measurement) { 
    // try to add the measurement 
    if (measurements.get(measurementName) == null) { 
     // Measurements m = new Measurements(measurementName); 
     ArrayList<Double> _data = new ArrayList<Double>(); 
     // m.addMeasurement(measurement); 
     _data.add(measurement); 
     measurements.put(measurementName, _data); 
    } 
    // if the measurement does not exist, create it 
    else { 
     measurements.get(measurementName).add(measurement); 
    } 
} 

/** 
* a method which returns the experiment name 
* 
* @return the experiment name 
*/ 
public String getExperimentName() { 
    return experimentName; 
} 

// This makes the object parselable, I don't understand why 
/** 
* a constructor for the parcelable variant of the object 
*/ 
public Experiment(Parcel in) { 
    measurements = new HashMap<String, ArrayList<Double>>(); 
    readFromParcel(in); 
} 

@Override 
public int describeContents() { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
/** 
* a method which writes the objects to a parcel 
*/ 
public void writeToParcel(Parcel dest, int flags) { 
    // dest.writeString(experimentName); 
    // for(String s: (Set<String>)measurements.keySet()){ 
    // dest.writeString(s); 
    // dest.writeValue(measurements.get(s)); 
    // } 
    Bundle b = new Bundle(); 
    b.putString("experimentName", experimentName); 
    b.putSerializable("measurements", measurements); 
    dest.writeBundle(b); 
} 

/** 
* a method which reads from a parcel 
*/ 
public void readFromParcel(Parcel in) { 
    // experimentName = in.readString(); 
    Bundle b = in.readBundle(); 
    experimentName = b.getString("experimentName"); 
    measurements = (HashMap<String, ArrayList<Double>>) b 
      .getSerializable("measurements"); 
} 

/** 
* generic parcelable creator method 
*/ 
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 
    public Experiment createFromParcel(Parcel in) { 
     return new Experiment(in); 
    } 

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

}

+0

이 나에게 Experiment.writeToParcel에서 다음과 같은 오류 제공합니다 "유형의 번들의 방법 putParcelable (문자열, Parcelable)이 적용되지 않습니다 인수 (문자열, HashMap ) " – user2393265

+0

잘 작동하는 수정 된 응답을 확인하십시오. 나는 이것이 당신을 도울 것이라고 생각합니다. –

+0

액티비티간에 번들을 보내고 받기위한 메소드를 추가했습니다. 거기에 문제가 있습니까? – user2393265